home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #14 / Monster Media No. 14 (April 1996) (Monster Media, Inc.).ISO / prog_bas / svgapv24.zip / SVGABC24.TXT < prev    next >
Text File  |  1996-01-30  |  279KB  |  11,568 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.                                   REFERENCE MANUAL
  9.  
  10.  
  11.                                    FOR SVGAQB.LIB
  12.  
  13.  
  14.                                    AND SVGAPV.LIB
  15.  
  16.  
  17.                                     THE SUPER VGA
  18.  
  19.  
  20.                                   GRAPHICS LIBRARY
  21.  
  22.  
  23.                                    TO BE USED WITH
  24.  
  25.  
  26.                                 MICROSOFT QUICKBASIC,
  27.  
  28.  
  29.                                 VISUAL BASIC FOR DOS
  30.  
  31.  
  32.                                AND BASIC PROFESSIONAL
  33.  
  34.  
  35.                                  DEVELOPMENT SYSTEM
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.           1993-1996 by Zephyr Software - Stephen L. Balkum and Daniel A.
  58.           Sill
  59.  
  60.           All rights reserved.  No part of this book shall be reproduced or
  61.           transmitted by any means, electronic, mechanical, photocopying,
  62.           recording or otherwise, without written permission from Zephyr
  63.           Software - Stephen L. Balkum and Daniel A. Sill.
  64.  
  65.           Although every effort has been made to insure the accuracy of the
  66.           material in this book, Zephyr Software, Stephen L. Balkum and
  67.           Daniel A. Sill assume no responsibility for errors or omissions.
  68.           In addition no liability is assumed for damages resulting from
  69.           the use of the information contained herein.
  70.  
  71.           Printed in the United States of America
  72.  
  73.           Trademarks
  74.  
  75.           Sound Blaster and Sound Blaster Pro are trademarks of Creative
  76.           Labs, Inc.
  77.           All others are trademarks of their respective owners.
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.                                                                          ii
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.                              SOFTWARE LICENSE AGREEMENT
  106.  
  107.                By using this software, you agree to the terms of this
  108.                                      agreement.
  109.  
  110.                No warranties are expressed or implied.  In no event
  111.                shall Zephyr Software, Stephen L. Balkum or Daniel A.
  112.                Sill be held liable for damages resulting from the use
  113.                or misuse of this product, including but not limited to
  114.                implied warranties of fitness for a particular purpose.
  115.  
  116.                The shareware version may be freely distributed as long
  117.                as all files stay together and are not modified in any
  118.                way.  No cost may be charged for the shareware version
  119.                beyond normal and reasonable copying and distribution
  120.                expenses.
  121.  
  122.                No products developed with this software shall be sold
  123.                unless this software has been registered with Zephyr
  124.                Software, Stephen L. Balkum or Daniel A. Sill.
  125.  
  126.                At no time for any reason shall this software be
  127.                reverse engineered, decompiled or disassembled.
  128.  
  129.                This software may not be rented or leased.
  130.  
  131.                This software may be used only on one terminal or one
  132.                computer at any one given moment in time.  This
  133.                software may not be installed on a network of any type.
  134.                Contact Zephyr Software, Stephen L. Balkum or Daniel A.
  135.                Sill for networking options.
  136.  
  137.                United States Government Restricted Rights:
  138.                Use, duplication or disclosure of this software and
  139.                documentation by the U.S. Government is subject to the
  140.                restrictions as set forth in subparagraph (c)(1)(ii) of
  141.                the Rights in Technical Data and Computer Software
  142.                clause at DFARS 252.227-7013.  Contractor/manufacturer
  143.                is Stephen L. Balkum and Daniel A. Sill, P.O. Box 7704,
  144.                Austin, Texas 78713-7704.
  145.  
  146.                The ownership of this software may be transferred as
  147.                long as Zephyr Software, Stephen L. Balkum or Daniel A.
  148.                Sill is notified in writing of the transfer date and
  149.                new owner.  The new owner must agree to this contract.
  150.                The transfer must include all registered updates and
  151.                previously registered versions.  The original owner may
  152.                not retain any copies in any form of the registered
  153.                software or its documents.
  154.  
  155.  
  156.  
  157.  
  158.  
  159.                                                                         iii
  160.  
  161.  
  162.  
  163.  
  164.  
  165.           INTRODUCTION
  166.  
  167.           We spent weeks searching the depths of the internet ftp sites for
  168.           a library that would allow the programmer full access to the
  169.           abilities of Super VGA.  We wanted the colors VGA could provide
  170.           and better resolution than EGA could provide.  Professionally
  171.           developed libraries with this ability were definitely out of our
  172.           price range.  After our searches continuously returned nothing,
  173.           we decided to fill the apparent void in the shareware market.
  174.  
  175.           Our searches did give two useful packages:  John Bridges' VGAKIT
  176.           and Finn Thoegersen's VGADOC.  We began with these two works and
  177.           developed a graphics library intended to allow the programmer
  178.           access to the huge world of high resolution programming.
  179.  
  180.           On the surface the task appeared quite simple.  However, it
  181.           quickly became obvious that the routines in this library would be
  182.           required to affect extremely large amounts of data.  Operations
  183.           must be quick to be successful.  Therefore, every effort was made
  184.           to create the fastest code possible - even at the expense of
  185.           size.  For this reason we opted to write code with the 32 bit
  186.           instructions of the 80386 and better processors.  It is our
  187.           opinion that anyone with a hi-res card in a lesser machine may
  188.           have some priorities out of order. All routines are written in
  189.           assembly and use absolutely no floating point values.  Anytime a
  190.           real number was required, fixed point notation was used.  In
  191.           addition we attempted to write the routines such that any
  192.           reasonable argument passed can be interpreted intelligently by
  193.           the library.
  194.  
  195.           With the numerous Super VGA cards available and no well
  196.           established standard we chose John Bridges' identification and
  197.           bank switching routines as a beginning.  These two routines have
  198.           undergone some modification, but not enough to justify
  199.           copyrighting this portion of the library's code by Zephyr
  200.           Software.  We have no intentions of releasing our changes to
  201.           these routines into the public domain.  From that point onward
  202.           all code is original.  In some instances common algorithms were
  203.           researched and original code written according to that algorithm.
  204.  
  205.           This Super VGA library gives the programmer transparent access to
  206.           twenty different Super VGA cards.  These cards include Acumos,
  207.           Ahead, ATI Technologies, Avance, Chips and Technologies, Cirrus
  208.           Logic, Everex, Genoa, MXIC, NCR, Oak Technologies,
  209.           Paradise/Western Digital, Primus, Realtek, Trident, Tseng Labs,
  210.           Video 7 and the VESA standard.  Please see the WHICHVGA function
  211.           for the specific chipsets.  The programmer only needs to verify
  212.           that the end user's card has been identified, but not which card
  213.           was recognized.  After proper identification, all functions react
  214.           in exactly the same fashion.  The library contains functions to
  215.           draw all of the major primitives.  In addition there are
  216.           functions that modify the screen palette, write text on the
  217.           screen with a choice of fonts and modify the reaction of the
  218.           primitives.  Identification routines include not only the video
  219.  
  220.  
  221.                                                                           2
  222.  
  223.  
  224.  
  225.  
  226.  
  227.           card, but also the amount of video memory, type of processor and
  228.           installed pointing devices.  Advanced functions provide full
  229.           mouse support (when used with a Microsoft compatible driver) and
  230.           joystick support.  Finally, support for two dimensional and three
  231.           dimensional coordinate systems is provided including rotation,
  232.           translation, scaling and projection.
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.                                                                           3
  284.  
  285.  
  286.  
  287.  
  288.  
  289.           SUGGESTED METHODS FOR USING THIS LIBRARY
  290.  
  291.           USE WITHIN THE BASIC ENVIRONMENT
  292.  
  293.           We assume that the programmer is familiar with all of the
  294.           capabilities of the Microsoft QuickBasic, Visual Basic (VBDOS) or
  295.           Basic Professional Development System (PDS) compiler and
  296.           environment.  Understanding of the LIB and LINK commands is
  297.           encouraged as well as the use of QuickLibraries.  However, to
  298.           ensure you are able to get up and running quickly, the following
  299.           commands may be helpful:
  300.  
  301.           To create a QuickLibrary from SVGAQB/PV.LIB, type the command:
  302.  
  303.               LINK /QU SVGAQB/PV.LIB, SVGAQB/PV.QLB, NUL, QUICKQLB.LIB
  304.  
  305.           where QUICKQLB.LIB is the name for your compiler's QuickLibrary
  306.           (BQLB45.LIB for QuickBasic 4.5, VBDOSQLB.LIB for VBDOS and
  307.           QBXQLB.LIB for PDS).
  308.  
  309.           If you wish to create a QuickLibrary from SVGAQB/PV.LIB and
  310.           additional libraries, type the command:
  311.  
  312.               LINK /QU SVGAQB/PV.LIB + ????.LIB (continue as desired),
  313.                             NEWLIB.QLB, NUL, QUICKQLB.LIB
  314.  
  315.           where QUICKQLB.LIB is the same as above and ????.LIB represents
  316.           the additional desired libraries.
  317.  
  318.           After the QuickLibrary has been created, you should start your
  319.           development environment by typing:
  320.  
  321.                     QuickBasic:    QB /L SVGAQB
  322.                     VBDOS:         VBDOS /L SVGAPV
  323.                     PDS:           QBX /L SVGAPV
  324.  
  325.           This will tell the compiler to use the QuickLibrary when running
  326.           and when creating an executable.
  327.  
  328.           VERIFICATION OF A COMPUTER'S HARDWARE
  329.  
  330.           It is strongly recommended that any program written with this
  331.           library first verifies that the computer is a 80386 or better by
  332.           calling the WHICHCPU function.  Many of the library's functions
  333.           use 386 exclusive code which may cause a computer with a lesser
  334.           processor to crash.  In addition WHICHMOUSE must be called before
  335.           calling any of the mouse functions.  Lastly, it is recommended
  336.           that WHICHJOYSTICK be called before a program uses the joystick
  337.           routines.
  338.  
  339.           It is required that a program call WHICHVGA prior to any function
  340.           that communicates with the video card.  If WHICHVGA returns a
  341.           zero for unknown card type, the program should not call any
  342.           graphics function.  Without proper identification of the video
  343.  
  344.  
  345.                                                                           4
  346.  
  347.  
  348.  
  349.  
  350.  
  351.           card any graphics function will likely cause a system failure.
  352.           It is recommended, although not necessary, that a program call
  353.           WHICHMEM prior to calling any RES function.  Although the video
  354.           card was properly identified, it may not have sufficient onboard
  355.           memory to support the desired resolution.  As a second check the
  356.           RES functions will do nothing if the video card has not been
  357.           identified or if the video card does not support the specified
  358.           resolution for memory or hardware reasons.
  359.  
  360.           THE 256 COLOR PALETTE
  361.  
  362.           The 256 color palette of the Super VGA cards is a six bit
  363.           palette.  Each of the 256 colors of the palette are described by
  364.           three values representing the intensity of the colors red, blue
  365.           and green.  These values can range from 0 to 63.  Anytime a value
  366.           outside of this range is used, the video card simply ignores the
  367.           upper two bits.  Therefore, 64 is the same as 0.  This should be
  368.           taken into consideration when manipulating the palette or when
  369.           importing a palette from an external source such as a PCX image.
  370.  
  371.           USE OF 2-D AND 3-D FUNCTIONS
  372.  
  373.           In the interest of speed, the 2-D and 3-D functions were written
  374.           to best work on multiple points at once.  We refer to these
  375.           functions as object-oriented.  This means that the points
  376.           defining an object (a box, a house, etc.) should be contained
  377.           within one array or part of an array and calls to the functions
  378.           should act on all of the points in the array.  Calls to functions
  379.           have a high speed overhead, therefore, placing more than one
  380.           object in the same array and passing the entire array to the
  381.           functions can be beneficial.  However, these functions will work
  382.           on a single point as well.
  383.  
  384.           A consequence of our object-oriented 2-D and 3-D functions is the
  385.           use of the scaling functions.  When scaling objects, we recommend
  386.           the object be defined about the origin.  D2SCALE and D3SCALE both
  387.           work with respect to the origin.  This eliminates a significant
  388.           number of translations that would otherwise be required by having
  389.           a definable scale origin.  For example, to draw two boxes, one
  390.           scaled by one-half of the other, each rotated by 45 degrees at
  391.           the center of the screen, the recommended procedure is as
  392.           follows:
  393.  
  394.             define an array BOX containing the 2-D points: (100, 100), (-
  395.                100, 100), (-100, -100), (100, -100), (note: the box is
  396.                centered about the origin.)
  397.             rotate BOX by 45 degrees about (0, 0) and place the output in
  398.                RBOX,
  399.             scale RBOX by 50% (scaling factor would be 128, or 80 hex) and
  400.                place output in SRBOX,
  401.             translate RBOX to the center of the screen - a translation of
  402.                320, 240 in 640x480 resolution - and place output in TRBOX,
  403.             translate SRBOX to the center of the screen - same translation
  404.                as for RBOX - and place output in TSRBOX,
  405.  
  406.  
  407.                                                                           5
  408.  
  409.  
  410.  
  411.  
  412.  
  413.             draw TRBOX and TSRBOX on the screen.
  414.  
  415.           Notice that by defining the box centered about the origin the
  416.           translation values were extremely intuitive.  Also notice that if
  417.           we had scaled the second box after the translation, it would have
  418.           been draw in the upper left quadrant of the screen instead of the
  419.           center.
  420.  
  421.           In mathematics and many sciences it is customary that in a 2-D
  422.           coordinate system the Y axis increases upward and the X axis
  423.           increases to the right.  The computer industry has decided the Y
  424.           axis should increase downward.  The 2-D functions are not
  425.           affected by the choice in coordinate systems.  However, it is
  426.           important to remember that a positive rotation in D2ROTATE
  427.           rotates from the positive X axis to the positive Y axis.
  428.           Therefore, when using mathematical conventions, a positive
  429.           rotation moves counter-clockwise.  On the computer screen a
  430.           positive rotation moves clockwise.
  431.  
  432.           The 3-D coordinate system follows mathematical conventions by
  433.           using a right-handed coordinate system.  The easiest way to
  434.           visualize this coordinate system is by using your right hand.
  435.           Place your index finger and thumb at a right angle to one another
  436.           as if to form an imaginary pistol.  Now place your second finger
  437.           at a right angle to your index finger.  It should be at a right
  438.           angle to your thumb as well.  This represents the three axes.
  439.           The index finger is the X axis, the second finger is the Y axis
  440.           and the thumb is the Z axis.  The easiest way to remember
  441.           rotation directions in this system is cyclically.  A positive
  442.           rotation about the X axis rotates the Y axis into the Z axis.  A
  443.           positive rotation about the Y axis rotates the Z axis into the X
  444.           axis.  A positive rotation about the Z axis rotates the X axis
  445.           into the Y axis.
  446.  
  447.           After doing all necessary 3-D transformations, projection onto
  448.           the 2-D computer screen is required.  Although the computer
  449.           screen's coordinate system does not follow mathematical
  450.           conventions, the D3PROJECT function automatically takes care of
  451.           all conversions.  The programmer only needs to draw the resulting
  452.           object on the screen with FILLCONVEXPOLY, FILLPOLY or a series of
  453.           DRWLINEs.
  454.  
  455.           THE CONCEPT OF SPRITE GRAPHICS
  456.  
  457.           The key to sprite graphics is the assumption that only a small
  458.           percentage of the pixels in a graphics block are used by the
  459.           animation and the remaining pixels should be treated as
  460.           transparent, revealing the background behind the sprite.  The
  461.           sprite routines in this library only act on non-transparent
  462.           colors, thus, saving time by ignoring a large number of pixels.
  463.           When retrieving the background for a sprite, prior knowledge of
  464.           the sprite itself permits obtaining background only where it is
  465.           necessary.
  466.  
  467.  
  468.  
  469.                                                                           6
  470.  
  471.  
  472.  
  473.  
  474.  
  475.           The following steps outline an example of the recommended
  476.           procedure for using the sprite functions:
  477.  
  478.             1. draw the sprite on the screen - a white stick figure on a
  479.                black background, for example
  480.             2. use BLKGET to place the sprite in an array STICK
  481.             3. use SPRITEGAP to simultaneously retrieve the background into
  482.                BACKSTICK and place STICK on the screen, declaring black as
  483.                the transparent color
  484.             4. use SPRITEPUT to replace the background BACKSTICK in the
  485.                same location as step 3
  486.             5. repeat steps 3 and 4 as many times and in as many locations
  487.                as desired
  488.  
  489.           EXTENDED MEMORY SUPPORT
  490.  
  491.           With the higher screen resolutions, more memory may be needed for
  492.           data storage.  For this reason extended memory support is
  493.           provided.  Accessing extended memory requires the computer to
  494.           switch into protected mode.  The process of switching into
  495.           protected mode and returning is handled by the extended memory
  496.           manager, usually HIMEM.SYS.  The switch is relatively slow.
  497.           Therefore, it should be used as fast storage access since it is
  498.           much faster than disk access.
  499.  
  500.           Extended memory access is also limited by the number of available
  501.           handles.  The limit is controlled by a switch on the extended
  502.           memory manager's command line and normally defaults to 32.  Also,
  503.           it is imperative that all allocated extended memory blocks be
  504.           freed before the program terminates.  Unfreed memory blocks will
  505.           be unavailable until the computer is rebooted.
  506.  
  507.           CONVENTIONS USED IN THIS MANUAL
  508.  
  509.           All parameters, other than strings, passed to and from functions
  510.           and procedures in this QuickBasic library are short (two byte)
  511.           integers.  No floating point values are used.
  512.  
  513.           Whenever a pixel is written on the screen, a mode is required.
  514.           Unless otherwise noted, there are four possible modes:  SET, XOR,
  515.           OR and AND.  These modes are represented by the numbers one
  516.           through four respectively.  Technically, SET is the fastest mode.
  517.           However, XOR maybe the most useful.  XOR'ing a point twice with
  518.           the same color returns the original color.  This can be used to
  519.           cover and uncover graphics.  In addition when a reference to a
  520.           color index is made, only values between and including 0 and 255
  521.           are valid.  Any integer will work, but only the lowest eight bits
  522.           are recognized.
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.                                                                           7
  532.  
  533.  
  534.  
  535.  
  536.  
  537.           BLKGET
  538.  
  539.             PROTOTYPE
  540.  
  541.             SUB BLKGET (X1%, Y1%, X2%, Y2%, GfxBlk%)
  542.  
  543.             INPUT
  544.  
  545.             X1, Y1 - top left corner of block
  546.             X2, Y2 - bottom right corner of block
  547.  
  548.             OUTPUT
  549.  
  550.             If declared as a function, BLKGET returns 1 if successful, 0
  551.             if failed.
  552.             GfxBlk - integer destination array holding retrieved bitmap
  553.  
  554.             USAGE
  555.  
  556.             BLKGET stores the pixel data contained within the block
  557.             defined by (X1, Y1)-(X2, Y2) in the variable referenced by
  558.             GfxBlk.  GfxBlk must be dimensioned as a short integer array
  559.             with a size in integers equal to
  560.                              [(X2-X1+1)*(Y2-Y1+1)] / 2+3.
  561.             Note, however, that GfxBlk can be quite large.  If the size of
  562.             GfxBlk is insufficient, BLKGET will overwrite any data in
  563.             memory contained beyond GfxBlk and may possibly cause the
  564.             system to crash.  BLKGET enforces X2 X1 and Y2Y1.  Also, the
  565.             coordinates must be valid on the screen at the current
  566.             resolution.
  567.  
  568.             The bitmap is stored such that the first integer in the
  569.             destination array is the width and the second integer is the
  570.             height.  The remaining bytes are the bitmap raster data stored
  571.             by rows starting at the top of the block.
  572.  
  573.             Arrays should be passed by giving the element within the array
  574.             from where the action should take place.  This allows the
  575.             programmer to store more than one item within the same array
  576.             or act on only a portion of the array.
  577.  
  578.             SEE ALSO
  579.  
  580.             BLKPUT, BLKRESIZE, BLKROTATE, GETLASTSTRING, SPRITEGAP,
  581.             SPRITEGET, SPRITEPUT, XMSBLKGET, XMSBLKPUT
  582.  
  583.             EXAMPLE
  584.  
  585.             REM PLACES 1/4 OF A CIRCLE AT THE CENTER OF THE SCREEN
  586.             REM $INCLUDE: 'SVGABC.BI'
  587.             DEFINT A-Z
  588.             DIM BLOCKDATA(0 TO 483) AS INTEGER
  589.             IF WHICHVGA = 0 THEN STOP
  590.             DUMMY=RES640
  591.  
  592.  
  593.                                                                           8
  594.  
  595.  
  596.  
  597.  
  598.  
  599.             DRWCIRCLE 1, 10, 30, 30, 20
  600.             FILLAREA 30, 30, 10, 7
  601.             BLKGET 0, 0, 30, 30, BLOCKDATA(0)
  602.             BLKPUT 1, 320, 240, BLOCKDATA(0)
  603.             WHILE INKEY$ = ""
  604.             WEND
  605.             DUMMY=RESTEXT
  606.             END
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.                                                                           9
  656.  
  657.  
  658.  
  659.  
  660.  
  661.           BLKPUT
  662.  
  663.             PROTOTYPE
  664.  
  665.             SUB BLKPUT (Mode%, X%, Y%, GfxBlk%)
  666.  
  667.             INPUT
  668.  
  669.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  670.             X, Y - location for top left corner of block
  671.             GfxBlk - integer source array
  672.  
  673.             OUTPUT
  674.  
  675.             no value returned
  676.  
  677.             USAGE
  678.  
  679.             BLKPUT places the pixel data contained in the variable
  680.             referenced by GfxBlk on the screen.  The top, left corner of
  681.             the block is specified by (X, Y).  Any (X, Y) is acceptable
  682.             and any portion of the block that lies outside of the
  683.             currently defined viewport will not be drawn.
  684.  
  685.             Arrays should be passed by giving the element within the array
  686.             from where the action should take place.  This allows the
  687.             programmer to store more than one item within the same array
  688.             or act on only a portion of the array.
  689.  
  690.             SEE ALSO
  691.  
  692.             BLKGET, BLKRESIZE, BLKROTATE, GETLASTSTRING, SPRITEGAP,
  693.             SPRITEGET, SPRITEPUT, PCXPUT, SETVIEW, XMSBLKGET, XMSBLKPUT
  694.  
  695.             EXAMPLE
  696.  
  697.             See BLKGET
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.                                                                          10
  718.  
  719.  
  720.  
  721.  
  722.  
  723.           BLKRESIZE
  724.  
  725.             PROTOTYPE
  726.  
  727.             SUB BLKRESIZE (NewXSize%, NewYSize%, SourceGfxBlk%,
  728.             DestGfxBlk%)
  729.  
  730.             INPUT
  731.  
  732.             NewXSize, NewYSize - size of resulting bitmap in DestGfxBlk
  733.             SourceGfxBlk - integer source array
  734.  
  735.             OUTPUT
  736.  
  737.             no value returned
  738.             DestGfxBlk - integer destination array holding resized bitmap
  739.  
  740.             USAGE
  741.  
  742.             BLKRESIZE takes the bitmap in SourceGfxBlk and scales it up or
  743.             down according the to values passed in NewXSize and NewYSize.
  744.             The resulting bitmap is returned in DestGfxBlk which should
  745.             already be declared with a size calculated according to the
  746.             equation in BLKGET.  NewXSize and NewYSize should not be zero.
  747.  
  748.             SEE ALSO
  749.  
  750.             BLKGET, BLKPUT, BLKROTATE
  751.  
  752.             EXAMPLE
  753.  
  754.             REM  RESIZE A BITMAP
  755.             REM $INCLUDE: 'SVGABC.BI'
  756.             DEFINT A-Z
  757.             DIM SRC%(0 TO 32000)
  758.             DIM DST%(0 TO 32000)
  759.  
  760.             IF WHICHCPU < 386 THEN END
  761.             IF WHICHVGA = 0 THEN END
  762.             VMODE=VIDEOMODEGET
  763.             IF RES640 <> 1 THEN
  764.                 DUMMY = RESTEXT
  765.                 END
  766.             END IF
  767.             X1 = 0
  768.             Y1 = 0
  769.             X2 = 50
  770.             Y2 = 50
  771.             FOR I = 0 TO 25
  772.                 XA = (RND * X2 - X1) + X1
  773.                 YA = (RND * Y2 - Y1) + Y1
  774.                 XB = (RND * X2 - X1) + X1
  775.                 YB = (RND * Y2 - Y1) + Y1
  776.                 C = RND * 16
  777.  
  778.  
  779.                                                                          11
  780.  
  781.  
  782.  
  783.  
  784.  
  785.                 DRWLINE 1, C, XA, YA, XB, YB
  786.             NEXT I
  787.             DRWBOX 1, 15, X1, Y1, X2, Y2
  788.             BLKGET X1, Y1, X2, Y2, SRC(0)
  789.             X1 = GETMAXX \ 2
  790.             Y1 = GETMAXY \ 2
  791.             X = SRC(0) + 1
  792.             Y = SRC(1) + 1
  793.             BLKRESIZE X, Y, SRC(0), DST(0)
  794.             BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  795.             FOR I = X TO X + 50
  796.                 BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  797.                 BLKRESIZE I, I, SRC(0), DST(0)
  798.                 BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  799.                 SDELAY 3
  800.             NEXT I
  801.             FOR I = X + 50 TO X - 50 STEP -1
  802.                 BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  803.                 BLKRESIZE I, I, SRC(0), DST(0)
  804.                 BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  805.                 SDELAY 3
  806.             NEXT I
  807.             FOR I = X - 50 TO X
  808.                 BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  809.                 BLKRESIZE I, I, SRC(0), DST(0)
  810.                 BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  811.                 SDELAY 3
  812.             NEXT I
  813.             VIDEOMODESET VMODE
  814.             END
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.                                                                          12
  842.  
  843.  
  844.  
  845.  
  846.  
  847.           BLKROTATE
  848.  
  849.             PROTOTYPE
  850.  
  851.             FUNCTION BLKROTATE% (Ang%, BackFillColor%, SourceGfxBlk%,
  852.             DestGfxBlk%)
  853.  
  854.             INPUT
  855.  
  856.             Ang - integer degree to rotate source bitmap
  857.             BackFillColor - index to color in current palette to fill
  858.             blank space in DestGfxBlk
  859.             SourceGfxBlk - integer source array
  860.  
  861.             OUTPUT
  862.  
  863.             BLKROTATE returns 1 if successful, 0 if unsuccessful.
  864.             DestGfxBlk - integer destination array holding rotated bitmap
  865.  
  866.             USAGE
  867.  
  868.             BLKROTATE takes the bitmap in SourceGfxBlk and rotates by the
  869.             number of degrees specified in Ang.  The bitmap rotation
  870.             algorithm is a three-pass shear technique modified to make
  871.             efficient use of this library's internal buffers.  Blank space
  872.             around the newly rotated block is filled with the color given
  873.             by BackFillColor.  The resulting bitmap is stored in
  874.             DestGfxBlk.  The size of DestGfxBlk should be at least as big
  875.             as given by BLKROTATESIZE.
  876.  
  877.             The function will fail if it calculates that the internal
  878.             buffers would be overflowed or if the destination array would
  879.             be larger than 65536 bytes.  BLKROTATESIZE should be called
  880.             first to ensure that buffer integrity is maintained.
  881.  
  882.             SEE ALSO
  883.  
  884.             BLKGET, BLKPUT, BLKRESIZE, BLKROTATESIZE
  885.  
  886.             EXAMPLE
  887.  
  888.             REM ROTATE A BITMAP
  889.             REM $INCLUDE: 'SVGABC.BI'
  890.             DEFINT A-Z
  891.             DIM SRC%(0 TO 32000)
  892.             DIM DST%(0 TO 32000)
  893.             IF WHICHCPU < 386 THEN END
  894.             IF WHICHVGA = 0 THEN END
  895.             VMODE = VIDEOMODEGET
  896.             IF RES640 <> 1 THEN
  897.                 DUMMY = RESTEXT
  898.                 END
  899.             END IF
  900.             X1 = 0
  901.  
  902.  
  903.                                                                          13
  904.  
  905.  
  906.  
  907.  
  908.  
  909.             Y1 = 0
  910.             X2 = 110
  911.             Y2 = 110
  912.             FOR I = 0 TO 50
  913.                 XA = (RND * X2 - X1) + X1
  914.                 YA = (RND * Y2 - Y1) + Y1
  915.                 XB = (RND * X2 - X1) + X1
  916.                 YB = (RND * Y2 - Y1) + Y1
  917.                 C = RND * 16
  918.                 DRWLINE 1, C, XA, YA, XB, YB
  919.             NEXT I
  920.             DRWBOX 1, 15, X1, Y1, X2, Y2
  921.             BLKGET X1, Y1, X2, Y2, SRC(0)
  922.             X1 = GETMAXX \ 2
  923.             Y1 = GETMAXY \ 2
  924.             FOR I = 0 TO 359 STEP 6
  925.                 IF BLKROTATESIZE(I, SRC(0)) <> 0 THEN
  926.                  DUMMY = BLKROTATE(I, 0, SRC(0), DST(0))
  927.                  BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  928.                  SDELAY 3
  929.                  BLKPUT 2, X1 - DST(0) \ 2, Y1 - DST(1) \ 2, DST(0)
  930.                 END IF
  931.             NEXT I
  932.             VIDEOMODESET VMODE
  933.             END
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947.  
  948.  
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.                                                                          14
  966.  
  967.  
  968.  
  969.  
  970.  
  971.           BLKROTATESIZE
  972.  
  973.             PROTOTYPE
  974.  
  975.             FUNCTION BLKROTATESIZE& (Ang%, SourceGfxBlk%)
  976.  
  977.             INPUT
  978.  
  979.             Ang - integer degree to rotate source bitmap
  980.             SourceGfxBlk - integer source array
  981.  
  982.             OUTPUT
  983.  
  984.             BLKROTATESIZE returns the number of bytes needed for the
  985.             destination array if successful, 0 if unsuccessful.
  986.  
  987.             USAGE
  988.  
  989.             BLKROTATESIZE takes the bitmap in SourceGfxBlk calculates the
  990.             required size of the output buffer needed when BLKROTATE is
  991.             called.  It also insures that the internal library buffers are
  992.             not overflowed.  The function will fail if it calculates that
  993.             the internal buffers would be overflowed or if the destination
  994.             array would be larger than 65536 bytes.  BLKROTATESIZE should
  995.             be called prior to BLKROTATE to ensure that buffer integrity
  996.             is maintained.
  997.  
  998.             SEE ALSO
  999.  
  1000.             BLKGET, BLKPUT, BLKRESIZE, BLKROTATE
  1001.  
  1002.             EXAMPLE
  1003.  
  1004.             See BLKROTATE
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.                                                                          15
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.           BYTECOPY
  1034.  
  1035.             PROTOTYPE
  1036.  
  1037.             SUB BYTECOPY (Source AS ANY, Dest AS ANY, NumOfBytes&)
  1038.  
  1039.             INPUT
  1040.  
  1041.             Source - integer array to be copied
  1042.             NumBytes - number of bytes to copy from Source to Dest
  1043.  
  1044.             OUTPUT
  1045.  
  1046.             no value returned
  1047.             Dest - integer destination array holding copied data
  1048.  
  1049.             USAGE
  1050.  
  1051.             BYTECOPY copies the specified number of bytes from Source to
  1052.             Dest.  It is much faster than using a FOR/NEXT loop.  NumBytes
  1053.             is equal to the number of bytes to be copied.  For example, if
  1054.             Source contains 10 integers to be copied, NumBytes is 2 * 10,
  1055.             or 20 bytes.  The declaration for BYTECOPY permits any
  1056.             variable type to be copied.  However, BYTECOPY will not work
  1057.             with strings.  It will copy strings contained with a user
  1058.             defined type.  Remember that real numbers and long integers
  1059.             are 4 bytes.
  1060.  
  1061.             Arrays should be passed by giving the element within the array
  1062.             from where the action should take place.  This allows the
  1063.             programmer to store more than one item within the same array
  1064.             or act on only a portion of the array.
  1065.  
  1066.             SEE ALSO
  1067.  
  1068.             PALCOPY
  1069.  
  1070.             EXAMPLE
  1071.  
  1072.             REM SHOW HOW BYTE COPY WORKS ON MANY DATA TYPES
  1073.             REM REMEBER: INTEGER=2 BYTES; LONG INTEGER=4 BYTES;
  1074.             REM SINGLE REAL=4 BYTES; LONG REAL=8 BYTES; USER DEFINED
  1075.             REM VARIABLES MUST BE CACULATED BY THEIR INDIVIDUAL PARTS;
  1076.             REM $INCLUDE: 'SVGABC.BI'
  1077.  
  1078.             TYPE MyType
  1079.                CustNum AS INTEGER
  1080.                CustAmnt AS SINGLE
  1081.                CustName AS STRING * 20
  1082.             END TYPE
  1083.  
  1084.             DEFINT A-Z
  1085.  
  1086.             DIM CA(0 TO 1) AS MyType
  1087.  
  1088.  
  1089.                                                                          16
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095.             DIM CB(0 TO 1) AS MyType
  1096.             DIM IntAryA(0 TO 2) AS INTEGER
  1097.             DIM IntAryB(0 TO 2) AS INTEGER
  1098.             DIM SingleAry(0 TO 5) AS SINGLE
  1099.             DIM LongAryA(0 TO 2) AS LONG
  1100.             DIM LongAryB(0 TO 2) AS LONG
  1101.             DIM LongRealAryA(0 TO 2) AS DOUBLE
  1102.             DIM LongRealAryB(0 TO 2) AS DOUBLE
  1103.  
  1104.             FOR I = 0 TO 1
  1105.                READ CA(I).CustNum
  1106.                READ CA(I).CustAmnt
  1107.                READ CA(I).CustName
  1108.             NEXT I
  1109.             FOR I = 0 TO 2
  1110.                READ IntAryA(I)
  1111.             NEXT I
  1112.             FOR I = 0 TO 2
  1113.                READ SingleAry(I)
  1114.             NEXT I
  1115.             FOR I = 0 TO 2
  1116.                READ LongAryA(I)
  1117.             NEXT I
  1118.             FOR I = 0 TO 2
  1119.                READ LongRealAryA(I)
  1120.             NEXT I
  1121.  
  1122.             REM HERE WE DO THE COPIES
  1123.             BYTECOPY CA(0), CB(0), 48
  1124.             BYTECOPY IntAryA(0), IntAryB(0), 6
  1125.             BYTECOPY SingleAry(0), SingleAry(3), 12
  1126.             BYTECOPY LongAryA(0), LongAryB(0), 12
  1127.             BYTECOPY LongRealAryA(0), LongRealAryB(0), 24
  1128.  
  1129.             PRINT "-------HERE ARE USER DEFINED ARRAYS:-------"
  1130.             FOR I = 0 TO 1
  1131.                PRINT CA(I).CustName; TAB(40); CB(I).CustName
  1132.                PRINT CA(I).CustNum; TAB(40); CB(I).CustNum
  1133.                PRINT CA(I).CustAmnt; TAB(40); CB(I).CustAmnt
  1134.             NEXT I
  1135.             PRINT "------HERE ARE SHORT INTEGER ARRAYS:-------"
  1136.             FOR I = 0 TO 2
  1137.                PRINT IntAryA(I); TAB(40); IntAryB(I)
  1138.             NEXT I
  1139.             PRINT "-------HERE ARE SHORT REAL ARRAYS:---------"
  1140.             FOR I = 0 TO 2
  1141.                PRINT SingleAry(I); TAB(40); SingleAry(I + 3)
  1142.             NEXT I
  1143.             PRINT "-------HERE ARE LONG INTEGER ARRAYS:-------"
  1144.             FOR I = 0 TO 2
  1145.                PRINT LongAryA(I); TAB(40); LongAryB(I)
  1146.             NEXT I
  1147.             PRINT "-------HERE ARE LONG REAL ARRAYS:----------"
  1148.             FOR I = 0 TO 2
  1149.  
  1150.  
  1151.                                                                          17
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.                PRINT LongRealAryA(I); TAB(40); LongRealAryB(I)
  1158.             NEXT I
  1159.             WHILE INKEY$ = ""
  1160.             WEND
  1161.  
  1162.             REM CUSTOMER DATA
  1163.             DATA 102,120.98,"John Doe"
  1164.             DATA 182,160.23,"Jane Smith"
  1165.  
  1166.             REM INTEGER DATA
  1167.             DATA 2,62,9456
  1168.  
  1169.             REM SINGLE REAL DATA
  1170.             DATA 1.23,45.342,13.13
  1171.  
  1172.             REM LONG INTEGER DATA
  1173.             DATA 45000,92538,101234
  1174.  
  1175.             REM LONG REAL DATA
  1176.             DATA 345.45345,834.923734,485344.456
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.                                                                          18
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.           D2ROTATE
  1220.  
  1221.             PROTOTYPE
  1222.  
  1223.             SUB D2ROTATE (NumPoints%, XOrigin%, YOrigin%, Angle%,
  1224.             InArray%, OutArray%)
  1225.  
  1226.             INPUT
  1227.  
  1228.             NumPoints - number of points to be rotated
  1229.             Xorigin, Yorigin - center of rotation
  1230.             Angle - angle of rotation about center
  1231.             InArray - P2DType array containing points to rotate
  1232.  
  1233.             OUTPUT
  1234.  
  1235.             no value returned
  1236.             OutArray - P2DType array holding rotated values
  1237.  
  1238.             USAGE
  1239.  
  1240.             D2ROTATE takes the two dimensional points given in InArray and
  1241.             rotates them by the specified angle about Xorigin, Yorigin.
  1242.             The results are returned in OutArray which can be the same as
  1243.             InArray.  A positive angle causes a clockwise rotation on the
  1244.             screen, from the positive X axis to the positive Y axis.
  1245.  
  1246.             Arrays should be passed by giving the element within the array
  1247.             from where the action should take place.  This allows the
  1248.             programmer to store more than one item within the same array
  1249.             or act on only a portion of the array.
  1250.  
  1251.             SEE ALSO
  1252.  
  1253.             D2SCALE, D2TRANSLATE
  1254.  
  1255.             EXAMPLE
  1256.  
  1257.             REM ROTATE A TRIANGLE ABOUT ONE CORNER
  1258.             REM $INCLUDE: 'SVGABC.BI'
  1259.             DEFINT A-Z
  1260.             DIM TRIO(1 TO 3) AS P2DType
  1261.             DIM TRI(1 TO 3) AS P2DType
  1262.             DIM TRI2(1 TO 3) AS P2DType
  1263.  
  1264.             TRIO(1).X = 0
  1265.             TRIO(1).Y = 0
  1266.             TRIO(2).X = -80
  1267.             TRIO(2).Y = 60
  1268.             TRIO(3).X = 80
  1269.             TRIO(3).Y = 60
  1270.             VMODE = VIDEOMODEGET
  1271.             IF WHICHVGA = 0 THEN STOP
  1272.             DUMMY=RES640
  1273.  
  1274.  
  1275.                                                                          19
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281.             GOSUB DRWTRI
  1282.             FOR I = 0 TO 360 STEP 2
  1283.             D2ROTATE 3, 0, 0, I, TRIO(1).X, TRI(1).X
  1284.             GOSUB DRWTRI
  1285.             SDELAY 2
  1286.             GOSUB ERTRI
  1287.             NEXT I
  1288.             GOSUB DRWTRI
  1289.             WHILE INKEY$ = ""
  1290.             WEND
  1291.             VIDEOMODESET VMODE
  1292.             END
  1293.  
  1294.             DRWTRI:
  1295.             D2TRANSLATE 3, 320, 240, TRI(1).X, TRI2(1).X
  1296.             DRWLINE 1, 10, TRI2(1).X, TRI2(1).Y, TRI2(2).X, TRI2(2).Y
  1297.             DRWLINE 1, 10, TRI2(2).X, TRI2(2).Y, TRI2(3).X, TRI2(3).Y
  1298.             DRWLINE 1, 10, TRI2(3).X, TRI2(3).Y, TRI2(1).X, TRI2(1).Y
  1299.             RETURN
  1300.  
  1301.             ERTRI:
  1302.             D2TRANSLATE 3, 320, 240, TRI(1).X, TRI2(1).X
  1303.             DRWLINE 1, 0, TRI2(1).X, TRI2(1).Y, TRI2(2).X, TRI2(2).Y
  1304.             DRWLINE 1, 0, TRI2(2).X, TRI2(2).Y, TRI2(3).X, TRI2(3).Y
  1305.             DRWLINE 1, 0, TRI2(3).X, TRI2(3).Y, TRI2(1).X, TRI2(1).Y
  1306.             RETURN
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.                                                                          20
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.           D2SCALE
  1344.  
  1345.             PROTOTYPE
  1346.  
  1347.             SUB D2SCALE (NumPoints%, ScaleX%, ScaleY%, InArray%,
  1348.             OutArray%)
  1349.  
  1350.             INPUT
  1351.  
  1352.             NumPoints - number of points to scale
  1353.             ScaleX - scale factor along X axis
  1354.             ScaleY - scale factor along Y axis
  1355.             InArray - P2DType array containing points to scale
  1356.  
  1357.             OUTPUT
  1358.  
  1359.             no value returned
  1360.             OutArray - P2DType array holding scaled values
  1361.  
  1362.             USAGE
  1363.  
  1364.             D2SCALE multiplies each coordinate in the two dimensional
  1365.             array InArray by the corresponding scale factor ScaleX or
  1366.             ScaleY.  The results are stored in OutArray which can be the
  1367.             same as InArray.  A scale factor of 256 (100 hex) is
  1368.             considered 100 percent and results in no change.  Therefore,
  1369.             128 (80 hex) reduces values by one half and 512 (200 hex)
  1370.             doubles values.
  1371.  
  1372.             Arrays should be passed by giving the element within the array
  1373.             from where the action should take place.  This allows the
  1374.             programmer to store more than one item within the same array
  1375.             or act on only a portion of the array.
  1376.  
  1377.             SEE ALSO
  1378.  
  1379.             D2ROTATE, D2TRANSLATE
  1380.  
  1381.             EXAMPLE
  1382.  
  1383.             REM SCALE A TRIANGLE
  1384.             REM $INCLUDE: 'SVGABC.BI'
  1385.             DEFINT A-Z
  1386.             DIM TRIO(1 TO 3) AS P2DType
  1387.             DIM TRI(1 TO 3) AS P2DType
  1388.             DIM TRI2(1 TO 3) AS P2DType
  1389.  
  1390.             TRIO(1).X = 0
  1391.             TRIO(1).Y = 0
  1392.             TRIO(2).X = -80
  1393.             TRIO(2).Y = 60
  1394.             TRIO(3).X = 80
  1395.             TRIO(3).Y = 60
  1396.             VMODE = VIDEOMODEGET
  1397.  
  1398.  
  1399.                                                                          21
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.             IF WHICHVGA = 0 THEN STOP
  1406.             DUMMY=RES640
  1407.             GOSUB DRWTRI
  1408.             FOR I = 256 TO 512 STEP 4
  1409.             D2SCALE 3, I, I, TRIO(1).X, TRI(1).X
  1410.             GOSUB DRWTRI
  1411.             SDELAY 2
  1412.             GOSUB ERTRI
  1413.             NEXT I
  1414.             FOR I = 512 TO 128 STEP -4
  1415.             D2SCALE 3, I, I, TRIO(1).X, TRI(1).X
  1416.             GOSUB DRWTRI
  1417.             SDELAY 2
  1418.             GOSUB ERTRI
  1419.             NEXT I
  1420.  
  1421.             FOR I = 128 TO 256 STEP 4
  1422.             D2SCALE 3, I, I, TRIO(1).X, TRI(1).X
  1423.             GOSUB DRWTRI
  1424.             SDELAY 2
  1425.             GOSUB ERTRI
  1426.             NEXT I
  1427.             GOSUB DRWTRI
  1428.             WHILE INKEY$ = ""
  1429.             WEND
  1430.             VIDEOMODESET VMODE
  1431.             END
  1432.  
  1433.             DRWTRI:
  1434.             D2TRANSLATE 3, 320, 240, TRI(1).X, TRI2(1).X
  1435.             DRWLINE 1, 10, TRI2(1).X, TRI2(1).Y, TRI2(2).X, TRI2(2).Y
  1436.             DRWLINE 1, 10, TRI2(2).X, TRI2(2).Y, TRI2(3).X, TRI2(3).Y
  1437.             DRWLINE 1, 10, TRI2(3).X, TRI2(3).Y, TRI2(1).X, TRI2(1).Y
  1438.             RETURN
  1439.  
  1440.             ERTRI:
  1441.             D2TRANSLATE 3, 320, 240, TRI(1).X, TRI2(1).X
  1442.             DRWLINE 1, 0, TRI2(1).X, TRI2(1).Y, TRI2(2).X, TRI2(2).Y
  1443.             DRWLINE 1, 0, TRI2(2).X, TRI2(2).Y, TRI2(3).X, TRI2(3).Y
  1444.             DRWLINE 1, 0, TRI2(3).X, TRI2(3).Y, TRI2(1).X, TRI2(1).Y
  1445.             RETURN
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.                                                                          22
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.           D2TRANSLATE
  1468.  
  1469.             PROTOTYPE
  1470.  
  1471.             SUB D2TRANSLATE (NumPoints%, TransX%, TransY%, InArray%,
  1472.             OutArray%)
  1473.  
  1474.             INPUT
  1475.  
  1476.             NumPoints - number of points to be translated
  1477.             TransX - distance to translate along X axis
  1478.             TransY - distance to translate along Y axis
  1479.             InArray - P2DType array containing points to translate
  1480.  
  1481.             OUTPUT
  1482.  
  1483.             no value returned
  1484.             OutArray - P2DType array holding translated values
  1485.  
  1486.             USAGE
  1487.  
  1488.             D2TRANSLATE takes the two dimensional points given in InArray
  1489.             and translates them by the specified number of pixels along
  1490.             each axis.  The results are returned in OutArray which can be
  1491.             the same as InArray.
  1492.  
  1493.             Arrays should be passed by giving the element within the array
  1494.             from where the action should take place.  This allows the
  1495.             programmer to store more than one item within the same array
  1496.             or act on only a portion of the array.
  1497.  
  1498.             SEE ALSO
  1499.  
  1500.             D2ROTATE, D2SCALE
  1501.  
  1502.             EXAMPLE
  1503.  
  1504.             REM TRANSLATE A TRIANGLE
  1505.             REM $INCLUDE: 'SVGABC.BI'
  1506.             DEFINT A-Z
  1507.             DIM TRIO(1 TO 3) AS P2DType
  1508.             DIM TRI(1 TO 3) AS P2DType
  1509.             DIM TRI2(1 TO 3) AS P2DType
  1510.  
  1511.             TRIO(1).X = 0
  1512.             TRIO(1).Y = 0
  1513.             TRIO(2).X = -80
  1514.             TRIO(2).Y = 60
  1515.             TRIO(3).X = 80
  1516.             TRIO(3).Y = 60
  1517.             VMODE = VIDEOMODEGET
  1518.             IF WHICHVGA = 0 THEN STOP
  1519.             DUMMY=RES640
  1520.             GOSUB DRWTRI
  1521.  
  1522.  
  1523.                                                                          23
  1524.  
  1525.  
  1526.  
  1527.  
  1528.  
  1529.             FOR I = 0 TO 100 STEP 4
  1530.             D2TRANSLATE 3, I, I, TRIO(1).X, TRI(1).X
  1531.             GOSUB DRWTRI
  1532.             SDELAY 2
  1533.             GOSUB ERTRI
  1534.             NEXT I
  1535.             FOR I = 100 TO 0 STEP -4
  1536.             D2TRANSLATE 3, I, I, TRIO(1).X, TRI(1).X
  1537.             GOSUB DRWTRI
  1538.             SDELAY 2
  1539.             GOSUB ERTRI
  1540.             NEXT I
  1541.             GOSUB DRWTRI
  1542.             WHILE INKEY$ = ""
  1543.             WEND
  1544.             VIDEOMODESET VMODE
  1545.             END
  1546.  
  1547.             DRWTRI:
  1548.             D2TRANSLATE 3, 320, 240, TRI(1).X, TRI2(1).X
  1549.             DRWLINE 1, 10, TRI2(1).X, TRI2(1).Y, TRI2(2).X, TRI2(2).Y
  1550.             DRWLINE 1, 10, TRI2(2).X, TRI2(2).Y, TRI2(3).X, TRI2(3).Y
  1551.             DRWLINE 1, 10, TRI2(3).X, TRI2(3).Y, TRI2(1).X, TRI2(1).Y
  1552.             RETURN
  1553.  
  1554.             ERTRI:
  1555.             D2TRANSLATE 3, 320, 240, TRI(1).X, TRI2(1).X
  1556.             DRWLINE 1, 0, TRI2(1).X, TRI2(1).Y, TRI2(2).X, TRI2(2).Y
  1557.             DRWLINE 1, 0, TRI2(2).X, TRI2(2).Y, TRI2(3).X, TRI2(3).Y
  1558.             DRWLINE 1, 0, TRI2(3).X, TRI2(3).Y, TRI2(1).X, TRI2(1).Y
  1559.             RETURN
  1560.  
  1561.  
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572.  
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.                                                                          24
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.           D3PROJECT
  1592.  
  1593.             PROTOTYPE
  1594.  
  1595.             FUNCTION D3PROJECT% (NumPoints%, ProjParams%, InArray%,
  1596.             OutArray%)
  1597.  
  1598.             INPUT
  1599.  
  1600.             NumPoints - number of points to be projected
  1601.             ProjParams - PROJType structure containing parameters used in
  1602.             projection
  1603.                EyeX, EyeY, EyeZ - 3D location of viewer
  1604.                ScrD - distance from viewer to projection screen
  1605.                Theta - angle from positive 3D X axis to viewing direction
  1606.                Phi - angle from positive 3D Z axis to viewing direction
  1607.             InArray - P3DType array containing points to project
  1608.  
  1609.             OUTPUT
  1610.  
  1611.             D3PROJECT returns 1 if successful, 0 if any one point failed.
  1612.             OutArray - P2DType array holding projected values
  1613.  
  1614.             USAGE
  1615.                                 +Z axis
  1616.                                    |                   /\
  1617.                                    |                  /  \
  1618.                                    |            !     \ * \
  1619.                                    |            !......X: /
  1620.                                    |            ! Phi / \/
  1621.                                    |            !    /  :
  1622.                                    |            !   /   :
  1623.                                    |            !  /    :
  1624.                                    |       EyeX ! /ScrD :
  1625.                                    |       EyeY !/      :
  1626.                                    |       EyeZ *- - - -:- - - - -
  1627.                                    |           / `      :
  1628.                                    |          /   `     :
  1629.                                    |         /      `   :
  1630.                                    |        /      ---` :
  1631.                                    |       /___----
  1632.                                    |      /     Theta
  1633.                                    |
  1634.                                    |_____________________________+Y axis
  1635.                                    /
  1636.                                   /
  1637.                                  /
  1638.                                 /
  1639.                                /
  1640.                               /
  1641.                              /
  1642.                          +X axis
  1643.  
  1644.  
  1645.  
  1646.  
  1647.                                                                          25
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.             D3PROJECT projects a specified number, NumPoints, of three
  1654.             dimensional points starting at InArray into two dimensions
  1655.             according to the parameters in ProjParams.  The two
  1656.             dimensional points are stored in OutArray.  The location of
  1657.             the viewer in this three dimensional space is given by EyeX,
  1658.             EyeY, EyeZ in the ProjParams structure.  The direction the
  1659.             viewer is facing is specified with ScrD, Theta, Phi in the
  1660.             ProjParams structure using spherical coordinates.  A virtual
  1661.             set of axes parallel to the true axes are placed at the
  1662.             viewer's location.  ScrD is the distance from the viewer to
  1663.             the center of the projection screen, i.e. the currently
  1664.             defined viewport on the monitor's screen.  Theta is the angle
  1665.             in the virtual X-Y plane from the virtual X axis to the
  1666.             projection screen.  Positive angles rotate counter-clockwise
  1667.             in the X-Y plane.  Lastly, the angle of elevation above or
  1668.             below the virtual X-Y plane is given by Phi.  Positive angles
  1669.             direct viewing above the plane; negative below.
  1670.  
  1671.             If a point is projected to a location behind the viewer, i.e.
  1672.             on the side of the viewer opposite the projection screen,
  1673.             D3PROJECT returns a zero indicating one or more failed points.
  1674.             The returned values of the X and Y for failed points will be -
  1675.             32768 to make them easily identified.
  1676.  
  1677.             Arrays should be passed by giving the element within the array
  1678.             from where the action should take place.  This allows the
  1679.             programmer to store more than one item within the same array
  1680.             or act on only a portion of the array.
  1681.  
  1682.             SEE ALSO
  1683.  
  1684.             D3ROTATE, D3TRANSLATE, D3SCALE, FILLCONVEXPOLY, FILLPOLY,
  1685.             SETVIEW
  1686.  
  1687.             EXAMPLE
  1688.  
  1689.             REM DRAW A CUBE AT THE CENTER OF THE SCREEN
  1690.             REM $INCLUDE: 'SVGABC.BI'
  1691.             DEFINT A-Z
  1692.             DIM CUBE(1 TO 8) AS P3DType
  1693.             DIM PLOT(1 TO 8) AS P2DType
  1694.             DIM PROJPARAMS AS PROJType
  1695.  
  1696.             CUBE(1).X =  100 : CUBE(1).Y = -100 : CUBE(1).Z =  100
  1697.             CUBE(2).X =  100 : CUBE(2).Y = -100 : CUBE(2).Z = -100
  1698.             CUBE(3).X =  100 : CUBE(3).Y =  100 : CUBE(3).Z = -100
  1699.             CUBE(4).X =  100 : CUBE(4).Y =  100 : CUBE(4).Z =  100
  1700.             CUBE(5).X = -100 : CUBE(5).Y = -100 : CUBE(5).Z =  100
  1701.             CUBE(6).X = -100 : CUBE(6).Y = -100 : CUBE(6).Z = -100
  1702.             CUBE(7).X = -100 : CUBE(7).Y =  100 : CUBE(7).Z = -100
  1703.             CUBE(8).X = -100 : CUBE(8).Y =  100 : CUBE(8).Z =  100
  1704.             VMODE = VIDEOMODEGET
  1705.             IF WHICHVGA = 0 THEN STOP
  1706.             DUMMY=RES640
  1707.  
  1708.  
  1709.                                                                          26
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.             PROJPARAMS.EYEX = -1040
  1716.             PROJPARAMS.EYEY = -600
  1717.             PROJPARAMS.EYEZ = -1200
  1718.             PROJPARAMS.SCRD = 1700
  1719.             PROJPARAMS.THETA = 30
  1720.             PROJPARAMS.PHI = 45
  1721.             DUMMY = D3PROJECT(8,PROJPARAMS.EYEX,CUBE(1).X,PLOT(1).X)
  1722.             GOSUB DRWCUBE
  1723.             WHILE INKEY$ = ""
  1724.             WEND
  1725.             VIDEOMODESET VMODE
  1726.             END
  1727.  
  1728.             DRWCUBE:
  1729.             FOR J=1 TO 3
  1730.             DRWLINE 1, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  1731.             NEXT J
  1732.             DRWLINE 1, 10, PLOT(4).X, PLOT(4).Y, PLOT(1).X, PLOT(1).Y
  1733.             FOR J=5 TO 7
  1734.             DRWLINE 1, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  1735.             NEXT J
  1736.             DRWLINE 1, 10, PLOT(8).X, PLOT(8).Y, PLOT(5).X, PLOT(5).Y
  1737.             FOR J=1 TO 4
  1738.             DRWLINE 1, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+4).X, PLOT(J+4).Y
  1739.             NEXT J
  1740.             RETURN
  1741.  
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.                                                                          27
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.           D3ROTATE
  1778.  
  1779.             PROTOTYPE
  1780.  
  1781.             SUB D3ROTATE (NumPoints%, X%, Y%, Z%, AngleZ%, AngleY%,
  1782.             AngleX%, InArray%, OutArray%)
  1783.  
  1784.             INPUT
  1785.  
  1786.             NumPoints - number of points to be rotated
  1787.             X, Y, Z - center of rotation
  1788.             AngleZ - angle of rotation about the Z axis
  1789.             AngleY - angle of rotation about the Y axis
  1790.             AngleX - angle of rotation about the X axis
  1791.             InArray - P3DType array containing points to rotate
  1792.  
  1793.             OUTPUT
  1794.  
  1795.             no value returned
  1796.             OutArray - P3DType array holding rotated values
  1797.  
  1798.             USAGE
  1799.  
  1800.             D3ROTATE takes the three dimensional points given in InArray
  1801.             and rotates them by the specified angles about Xorigin,
  1802.             Yorigin, Zorigin.  The results are returned in OutArray which
  1803.             can be the same as InArray.  A virtual set of axes are placed
  1804.             at the origin of rotation and rotation takes place about these
  1805.             axes.  A positive angle causes a counter-clockwise rotation
  1806.             from the positive X axis to the positive Y axis.
  1807.  
  1808.             Arrays should be passed by giving the element within the array
  1809.             from where the action should take place.  This allows the
  1810.             programmer to store more than one item within the same array
  1811.             or act on only a portion of the array.
  1812.  
  1813.             SEE ALSO
  1814.  
  1815.             D3PROJECT, D3SCALE, D3TRANSLATE
  1816.  
  1817.             EXAMPLE
  1818.  
  1819.             REM ROTATE A CUBE AT THE CENTER OF THE SCREEN
  1820.             REM $INCLUDE: 'SVGABC.BI'
  1821.             DEFINT A-Z
  1822.             DIM CUBE(1 TO 8) AS P3DType
  1823.             DIM RCUBE(1 TO 8) AS P3DType
  1824.             DIM PLOT(1 TO 8) AS P2DType
  1825.             DIM PROJPARAMS AS PROJType
  1826.  
  1827.             CUBE(1).X =  100 : CUBE(1).Y = -100 : CUBE(1).Z =  100
  1828.             CUBE(2).X =  100 : CUBE(2).Y = -100 : CUBE(2).Z = -100
  1829.             CUBE(3).X =  100 : CUBE(3).Y =  100 : CUBE(3).Z = -100
  1830.             CUBE(4).X =  100 : CUBE(4).Y =  100 : CUBE(4).Z =  100
  1831.  
  1832.  
  1833.                                                                          28
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.             CUBE(5).X = -100 : CUBE(5).Y = -100 : CUBE(5).Z =  100
  1840.             CUBE(6).X = -100 : CUBE(6).Y = -100 : CUBE(6).Z = -100
  1841.             CUBE(7).X = -100 : CUBE(7).Y =  100 : CUBE(7).Z = -100
  1842.             CUBE(8).X = -100 : CUBE(8).Y =  100 : CUBE(8).Z =  100
  1843.             VMODE = VIDEOMODEGET
  1844.             IF WHICHVGA = 0 THEN STOP
  1845.             DUMMY=RES640
  1846.             PROJPARAMS.EYEX = -1040
  1847.             PROJPARAMS.EYEY = -600
  1848.             PROJPARAMS.EYEZ = -1200
  1849.             PROJPARAMS.SCRD = 1700
  1850.             PROJPARAMS.THETA = 30
  1851.             PROJPARAMS.PHI = 45
  1852.             FOR I = 0 TO 360 STEP 5
  1853.             D3ROTATE 8, 0, 0, 0, I, I, I, CUBE(1).X, RCUBE(1).X
  1854.             DUMMY = D3PROJECT(8,PROJPARAMS.EYEX,RCUBE(1).X,PLOT(1).X)
  1855.             GOSUB DRWCUBE
  1856.             SDELAY 2
  1857.             GOSUB DRWCUBE
  1858.             NEXT I
  1859.             WHILE INKEY$ = ""
  1860.             WEND
  1861.             VIDEOMODESET VMODE
  1862.             END
  1863.  
  1864.             DRWCUBE:
  1865.             FOR J=1 TO 3
  1866.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  1867.             NEXT J
  1868.             DRWLINE 2, 10, PLOT(4).X, PLOT(4).Y, PLOT(1).X, PLOT(1).Y
  1869.             FOR J=5 TO 7
  1870.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  1871.             NEXT J
  1872.             DRWLINE 2, 10, PLOT(8).X, PLOT(8).Y, PLOT(5).X, PLOT(5).Y
  1873.             FOR J=1 TO 4
  1874.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+4).X, PLOT(J+4).Y
  1875.             NEXT J
  1876.             RETURN
  1877.  
  1878.  
  1879.  
  1880.  
  1881.  
  1882.  
  1883.  
  1884.  
  1885.  
  1886.  
  1887.  
  1888.  
  1889.  
  1890.  
  1891.  
  1892.  
  1893.  
  1894.  
  1895.                                                                          29
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.           D3SCALE
  1902.  
  1903.             PROTOTYPE
  1904.  
  1905.             SUB D3SCALE (NumPoints%, ScaleX%, ScaleY%, ScaleZ%, InArray%,
  1906.             OutArray%)
  1907.  
  1908.             INPUT
  1909.  
  1910.             NumPoints - number of points to scale
  1911.             ScaleX - scale factor along X axis
  1912.             ScaleY - scale factor along Y axis
  1913.             ScaleZ - scale factor along Z axis
  1914.             InArray - P3DType array containing points to scale
  1915.  
  1916.             OUTPUT
  1917.  
  1918.             no value returned
  1919.             OutArray - P3DType array holding scaled values
  1920.  
  1921.             USAGE
  1922.  
  1923.             D3SCALE multiplies each coordinate in the three dimensional
  1924.             array InArray by the corresponding scale factor ScaleX, ScaleY
  1925.             or ScaleZ.  The results are stored in OutArray which can be
  1926.             the same as InArray.  A scale factor of 256 (100 hex) is
  1927.             considered 100 percent and results in no change.  Therefore,
  1928.             128 (80 hex) reduces values by one half and 512 (200 hex)
  1929.             doubles values.
  1930.  
  1931.             Arrays should be passed by giving the element within the array
  1932.             from where the action should take place.  This allows the
  1933.             programmer to store more than one item within the same array
  1934.             or act on only a portion of the array.
  1935.  
  1936.             SEE ALSO
  1937.  
  1938.             D3PROJECT, D3ROTATE, D3TRANSLATE
  1939.  
  1940.             EXAMPLE
  1941.  
  1942.             REM SCALE A CUBE AT THE CENTER OF THE SCREEN
  1943.             REM $INCLUDE: 'SVGABC.BI'
  1944.             DEFINT A-Z
  1945.             DIM CUBE(1 TO 8) AS P3DType
  1946.             DIM SCUBE(1 TO 8) AS P3DType
  1947.             DIM PLOT(1 TO 8) AS P2DType
  1948.             DIM PROJPARAMS AS PROJType
  1949.  
  1950.             CUBE(1).X =  100 : CUBE(1).Y = -100 : CUBE(1).Z =  100
  1951.             CUBE(2).X =  100 : CUBE(2).Y = -100 : CUBE(2).Z = -100
  1952.             CUBE(3).X =  100 : CUBE(3).Y =  100 : CUBE(3).Z = -100
  1953.             CUBE(4).X =  100 : CUBE(4).Y =  100 : CUBE(4).Z =  100
  1954.             CUBE(5).X = -100 : CUBE(5).Y = -100 : CUBE(5).Z =  100
  1955.  
  1956.  
  1957.                                                                          30
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.             CUBE(6).X = -100 : CUBE(6).Y = -100 : CUBE(6).Z = -100
  1964.             CUBE(7).X = -100 : CUBE(7).Y =  100 : CUBE(7).Z = -100
  1965.             CUBE(8).X = -100 : CUBE(8).Y =  100 : CUBE(8).Z =  100
  1966.             VMODE = VIDEOMODEGET
  1967.             IF WHICHVGA = 0 THEN STOP
  1968.             DUMMY=RES640
  1969.             PROJPARAMS.EYEX = -1040
  1970.             PROJPARAMS.EYEY = -600
  1971.             PROJPARAMS.EYEZ = -1200
  1972.             PROJPARAMS.SCRD = 1700
  1973.             PROJPARAMS.THETA = 30
  1974.             PROJPARAMS.PHI = 45
  1975.             FOR I = 256 TO 128 STEP -4
  1976.             D3SCALE 8, I, I, I, CUBE(1).X, SCUBE(1).X
  1977.             DUMMY = D3PROJECT(8,PROJPARAMS.EYEX,SCUBE(1).X,PLOT(1).X)
  1978.             GOSUB DRWCUBE
  1979.             SDELAY 2
  1980.             GOSUB DRWCUBE
  1981.             NEXT I
  1982.             FOR I = 132 TO 256 STEP 4
  1983.             D3SCALE 8, I, I, I, CUBE(1).X, SCUBE(1).X
  1984.             DUMMY = D3PROJECT(8,PROJPARAMS.EYEX,SCUBE(1).X,PLOT(1).X)
  1985.             GOSUB DRWCUBE
  1986.             SDELAY 2
  1987.             GOSUB DRWCUBE
  1988.             NEXT I
  1989.             WHILE INKEY$ = ""
  1990.             WEND
  1991.             VIDEOMODESET VMODE
  1992.             END
  1993.  
  1994.             DRWCUBE:
  1995.             FOR J=1 TO 3
  1996.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  1997.             NEXT J
  1998.             DRWLINE 2, 10, PLOT(4).X, PLOT(4).Y, PLOT(1).X, PLOT(1).Y
  1999.             FOR J=5 TO 7
  2000.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  2001.             NEXT J
  2002.             DRWLINE 2, 10, PLOT(8).X, PLOT(8).Y, PLOT(5).X, PLOT(5).Y
  2003.             FOR J=1 TO 4
  2004.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+4).X, PLOT(J+4).Y
  2005.             NEXT J
  2006.             RETURN
  2007.  
  2008.  
  2009.  
  2010.  
  2011.  
  2012.  
  2013.  
  2014.  
  2015.  
  2016.  
  2017.  
  2018.  
  2019.                                                                          31
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.           D3TRANSLATE
  2026.  
  2027.             PROTOTYPE
  2028.  
  2029.             SUB D3TRANSLATE (NumPoints%, TransX%, TransY%, TransZ%,
  2030.             InArray%, OutArray%)
  2031.  
  2032.             INPUT
  2033.  
  2034.             NumPoints - number of points to translate
  2035.             TransX - distance to translate along X axis
  2036.             TransY - distance to translate along Y axis
  2037.             TransZ - distance to translate along Z axis
  2038.             InArray - P3DType array containing points to translate
  2039.  
  2040.             OUTPUT
  2041.  
  2042.             no value returned
  2043.             OutArray - P3DType array holding translated points
  2044.  
  2045.             USAGE
  2046.  
  2047.             D3TRANSLATE takes the three dimensional points given in
  2048.             InArray and translates them by the specified number of pixels
  2049.             along each axis.  The results are returned in OutArray which
  2050.             can be the same as InArray.
  2051.  
  2052.             Arrays should be passed by giving the element within the array
  2053.             from where the action should take place.  This allows the
  2054.             programmer to store more than one item within the same array
  2055.             or act on only a portion of the array.
  2056.  
  2057.             SEE ALSO
  2058.  
  2059.             D3PROJECT, D3ROTATE, D3SCALE
  2060.  
  2061.             EXAMPLE
  2062.  
  2063.             REM TRANSLATE A CUBE NEAR THE CENTER OF THE SCREEN
  2064.             REM $INCLUDE: 'SVGABC.BI'
  2065.             DEFINT A-Z
  2066.             DIM CUBE(1 TO 8) AS P3DType
  2067.             DIM TCUBE(1 TO 8) AS P3DType
  2068.             DIM PLOT(1 TO 8) AS P2DType
  2069.             DIM PROJPARAMS AS PROJType
  2070.  
  2071.             CUBE(1).X =  100 : CUBE(1).Y = -100 : CUBE(1).Z =  100
  2072.             CUBE(2).X =  100 : CUBE(2).Y = -100 : CUBE(2).Z = -100
  2073.             CUBE(3).X =  100 : CUBE(3).Y =  100 : CUBE(3).Z = -100
  2074.             CUBE(4).X =  100 : CUBE(4).Y =  100 : CUBE(4).Z =  100
  2075.             CUBE(5).X = -100 : CUBE(5).Y = -100 : CUBE(5).Z =  100
  2076.             CUBE(6).X = -100 : CUBE(6).Y = -100 : CUBE(6).Z = -100
  2077.             CUBE(7).X = -100 : CUBE(7).Y =  100 : CUBE(7).Z = -100
  2078.             CUBE(8).X = -100 : CUBE(8).Y =  100 : CUBE(8).Z =  100
  2079.  
  2080.  
  2081.                                                                          32
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.             VMODE = VIDEOMODEGET
  2088.             IF WHICHVGA = 0 THEN STOP
  2089.             DUMMY=RES640
  2090.             PROJPARAMS.EYEX = -1040
  2091.             PROJPARAMS.EYEY = -600
  2092.             PROJPARAMS.EYEZ = -1200
  2093.             PROJPARAMS.SCRD = 1700
  2094.             PROJPARAMS.THETA = 30
  2095.             PROJPARAMS.PHI = 45
  2096.             FOR I = 0 TO 100 STEP 2
  2097.             D3TRANSLATE 8, I, I, I, CUBE(1).X, TCUBE(1).X
  2098.             DUMMY = D3PROJECT(8,PROJPARAMS.EYEX,TCUBE(1).X,PLOT(1).X)
  2099.             GOSUB DRWCUBE
  2100.             SDELAY 2
  2101.             GOSUB DRWCUBE
  2102.             NEXT I
  2103.             FOR I = 98 TO 0 STEP -2
  2104.             D3TRANSLATE 8, I, I, I, CUBE(1).X, TCUBE(1).X
  2105.             DUMMY = D3PROJECT(8,PROJPARAMS.EYEX,TCUBE(1).X,PLOT(1).X)
  2106.             GOSUB DRWCUBE
  2107.             SDELAY 2
  2108.             GOSUB DRWCUBE
  2109.             NEXT I
  2110.             WHILE INKEY$ = ""
  2111.             WEND
  2112.             VIDEOMODESET VMODE
  2113.             END
  2114.  
  2115.             DRWCUBE:
  2116.             FOR J=1 TO 3
  2117.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  2118.             NEXT J
  2119.             DRWLINE 2, 10, PLOT(4).X, PLOT(4).Y, PLOT(1).X, PLOT(1).Y
  2120.             FOR J=5 TO 7
  2121.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+1).X, PLOT(J+1).Y
  2122.             NEXT J
  2123.             DRWLINE 2, 10, PLOT(8).X, PLOT(8).Y, PLOT(5).X, PLOT(5).Y
  2124.             FOR J=1 TO 4
  2125.             DRWLINE 2, 10, PLOT(J).X, PLOT(J).Y, PLOT(J+4).X, PLOT(J+4).Y
  2126.             NEXT J
  2127.             RETURN
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135.  
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143.                                                                          33
  2144.  
  2145.  
  2146.  
  2147.  
  2148.  
  2149.           DRWALINE
  2150.  
  2151.             PROTOTYPE
  2152.  
  2153.             SUB DRWALINE (ColrBits%, Colr%, X1%, Y1%, X2%, Y2%)
  2154.  
  2155.             INPUT
  2156.  
  2157.             ColrBits - number of bits of color
  2158.             Colr - index to color in current palette
  2159.             X1, Y1 - location of one endpoint of line
  2160.             X2, Y2 - location of other endpoint of line
  2161.  
  2162.             OUTPUT
  2163.  
  2164.             no value returned
  2165.  
  2166.             USAGE
  2167.  
  2168.             DRWALINE draws an antialiased line of the specified color
  2169.             using with endpoints located at (X1, Y1) and (X2,Y2).
  2170.             Antialiased lines trick the eye into seeing true vector lines
  2171.             instead of a jagged series of individual pixels.  This is
  2172.             accomplished by drawing two pixels of the same color but with
  2173.             different intensities (brightness) for each pixel drawn by
  2174.             DRWALINE.  The eye averages the pixels to see only a straight
  2175.             line.  Note that the palette must be set up with the correct
  2176.             color entries for the line to look correct.  All values of X1,
  2177.             Y1, X2 and Y2 are valid.  Any portion of the line that lies
  2178.             outside of the currently defined viewport will not be drawn.
  2179.             Colrbits should be a number in the range of 0 to 6 specifying
  2180.             the number of shades of color in the palette (20 =1 is one
  2181.             color shade; 26=64 is 64 shades of color).  These shades
  2182.             should be contiguous in the palette from index colr to index
  2183.             (colr + 2colrbits - 1) starting with the full desired
  2184.             brightness.  The best compromise of detail versus palette
  2185.             entries is about 3 (23=8 is 8 shades, or palette entries, of
  2186.             color).
  2187.  
  2188.             SEE ALSO
  2189.  
  2190.             DRWLINE, DRWBOX, SETVIEW
  2191.  
  2192.             EXAMPLE
  2193.  
  2194.             REM THIS SHOWS NORMAL AND ANTIALISED LINES TOGETHER
  2195.             REM $INCLUDE: 'SVGABC.BI'
  2196.             DEFINT A-Z
  2197.             DIM Pal AS STRING * 768
  2198.  
  2199.             CLS
  2200.             IF WHICHVGA = 0 THEN STOP
  2201.             DUMMY = RES640
  2202.             REM SET UP THE PALETTE
  2203.  
  2204.  
  2205.                                                                          34
  2206.  
  2207.  
  2208.  
  2209.  
  2210.  
  2211.             INTSBITS = 2
  2212.             NUMLEVELS = 2 ^ INTSBITS
  2213.             PALGET Pal, 0, 255
  2214.             FOR I = 0 TO NUMLEVELS - 1
  2215.                OFST = 1 + (16 + I) * 3
  2216.                MID$(Pal, OFST + 0, 1) = CHR$(63 - 35 * I / (NUMLEVELS - 1))
  2217.                MID$(Pal, OFST + 1, 1) = CHR$(63 - 35 * I / (NUMLEVELS - 1))
  2218.                MID$(Pal, OFST + 2, 1) = CHR$(63 - 35 * I / (NUMLEVELS - 1))
  2219.             NEXT I
  2220.             PALSET Pal, 0, 255
  2221.             OFST = GETMAXY / 2 - 1
  2222.             YA = GETMAXY / 3
  2223.             YB = 2 * GETMAXY / 3
  2224.             FOR Y = 0 TO OFST STEP 12
  2225.                DRWLINE 1, 15, 0, YA, GETMAXX, Y
  2226.                DRWALINE INTSBITS, 16, 0, YB, GETMAXX, OFST + Y
  2227.             NEXT Y
  2228.             WHILE INKEY$ = ""
  2229.             WEND
  2230.             DUMMY = RESTEXT
  2231.             END
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.  
  2248.  
  2249.  
  2250.  
  2251.  
  2252.  
  2253.  
  2254.  
  2255.  
  2256.  
  2257.  
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.                                                                          35
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273.           DRWBOX
  2274.  
  2275.             PROTOTYPE
  2276.  
  2277.             SUB DRWBOX (Mode%, Color%, X1%, Y1%, X2%, Y2%)
  2278.  
  2279.             INPUT
  2280.  
  2281.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2282.             Color - index to color in current palette
  2283.             X1, Y1 - location of top left corner
  2284.             X2, Y2 - location of bottom right corner
  2285.  
  2286.             OUTPUT
  2287.  
  2288.             no value returned
  2289.  
  2290.             USAGE
  2291.  
  2292.             DRWBOX draws a rectangle of the color specified using Mode
  2293.             with opposite vertices defined by (X1, Y1) and (X2, Y2).  The
  2294.             vertices given do not need to be exactly the top left and
  2295.             bottom right.  They only have to reference opposite sides of
  2296.             the rectangle.  Any portion of the rectangle that lies outside
  2297.             of the currently defined viewport will not be drawn.
  2298.  
  2299.             SEE ALSO
  2300.  
  2301.             DRWFILLBOX, DRWLINE, SETVIEW
  2302.  
  2303.             EXAMPLE
  2304.  
  2305.             REM DRAWS A BOX AROUND THE WHOLE SCREEN
  2306.             REM $INCLUDE: 'SVGABC.BI'
  2307.             DEFINT A-Z
  2308.  
  2309.             VMODE=VIDEOMODEGET
  2310.             IF WHICHVGA = 0 THEN STOP
  2311.             DUMMY=RES640
  2312.             DRWBOX 1, 10, 0, 0, 639, 479
  2313.             WHILE INKEY$ = ""
  2314.             WEND
  2315.             VIDEOMODESET VMODE
  2316.             END
  2317.  
  2318.  
  2319.  
  2320.  
  2321.  
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.                                                                          36
  2330.  
  2331.  
  2332.  
  2333.  
  2334.  
  2335.           DRWCIRARC
  2336.  
  2337.             PROTOTYPE
  2338.  
  2339.             SUB DRWCIRARC (Mode%, Color%, Xcenter%, Ycenter%, Radius%,
  2340.             StartAng&, EndAng&)
  2341.  
  2342.             INPUT
  2343.  
  2344.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2345.             Color - index to color in current palette
  2346.             Xcenter, Ycenter - location of center of circle
  2347.             Radius - distance from center to edge of circle
  2348.             StartAng, EndAng - start and end angles in degrees
  2349.  
  2350.             OUTPUT
  2351.  
  2352.             no value returned
  2353.  
  2354.             USAGE
  2355.  
  2356.             DRWCIRARC draws a circular  arc of the specified color and
  2357.             mode with the center located at (Xcenter, Ycenter), radius of
  2358.             Radius, starting at the angle specified by StartAng and ending
  2359.             at the angle specified by EndAng.  All values of Xcenter,
  2360.             Ycenter, Radius, StartAng, and EndAng are valid.  However,
  2361.             StartAng must be less than EndAng.  Any portion of the arc
  2362.             that lies outside of the currently defined viewport will not
  2363.             be drawn.
  2364.  
  2365.             SEE ALSO
  2366.  
  2367.             DRWCIRCLE, DRWELLARC
  2368.  
  2369.             EXAMPLE
  2370.  
  2371.             REM DRAWS SOME CIRCULAR ARCS
  2372.             REM $INCLUDE: 'SVGABC.BI'
  2373.             DEFINT A-Z
  2374.  
  2375.             IF WHICHVGA = 0 THEN END
  2376.             DUMMY = RES640
  2377.             FOR I = 1 TO 60
  2378.                R = I * 5
  2379.                SANG = I * 6
  2380.                DRWCIRARC 1, 10, GETMAXX \ 2, GETMAXY \ 2, R, SANG, 360
  2381.             NEXT I
  2382.             WHILE INKEY$ = ""
  2383.             WEND
  2384.             DUMMY = RESTEXT
  2385.             CLS
  2386.             END
  2387.  
  2388.  
  2389.  
  2390.  
  2391.                                                                          37
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.           DRWCIRCLE
  2398.  
  2399.             PROTOTYPE
  2400.  
  2401.             SUB DRWCIRCLE (Mode%, Color%, Xcenter%, Ycenter%, Radius%)
  2402.  
  2403.             INPUT
  2404.  
  2405.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2406.             Color - index to color in current palette
  2407.             Xcenter, Ycenter - location of center of circle
  2408.             Radius - distance from center to edge of circle
  2409.  
  2410.             OUTPUT
  2411.  
  2412.             no value returned
  2413.  
  2414.             USAGE
  2415.  
  2416.             DRWCIRCLE draws a circle of the specified color using Mode
  2417.             with the center located at (Xcenter, Ycenter) and a radius of
  2418.             Radius.  All values of Xcenter, Ycenter and Radius are valid.
  2419.             Any portion of the circle that lies outside of the currently
  2420.             defined viewport will not be drawn.
  2421.  
  2422.             SEE ALSO
  2423.  
  2424.             DRWCIRARC, DRWELLIPSE, DRWFILLCIRCLE, SETVIEW
  2425.  
  2426.             EXAMPLE
  2427.  
  2428.             REM DRAWS A CIRCLE AT THE CENTER OF THE SCREEN
  2429.             REM $INCLUDE: 'SVGABC.BI'
  2430.             DEFINT A-Z
  2431.  
  2432.             VMODE=VIDEOMODEGET
  2433.             IF WHICHVGA = 0 THEN STOP
  2434.             DUMMY=RES640
  2435.             DRWCIRCLE 1, 10, 320, 240, 200
  2436.             WHILE INKEY$ = ""
  2437.             WEND
  2438.             VIDEOMODESET VMODE
  2439.             END
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.  
  2446.  
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.  
  2453.                                                                          38
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.           DRWCUBICBEZIER
  2460.  
  2461.             PROTOTYPE
  2462.  
  2463.             SUB DRWCUBICBEZIER (Mode%, Color%, Pon1%, Poff1%, Poff2%,
  2464.             Pon2%)
  2465.  
  2466.             INPUT
  2467.  
  2468.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2469.             Color - index to color in current palette
  2470.             Pon1% - P2DType variable containing the start point
  2471.             Poff1% - P2DType variable containing the first offset point
  2472.             Poff2% - P2DType variable containing the second offset point
  2473.             Pon2% - P2DType variable containing the end  point
  2474.  
  2475.             OUTPUT
  2476.  
  2477.             no value returned
  2478.  
  2479.             USAGE
  2480.  
  2481.             DRWCUBICBEZIER draws a standard cubic Bezier curve connecting
  2482.             the points Pon1 and Pon2 using the specified Mode and Color.
  2483.             The off-curve control points are Poff1 and Poff2.  A technical
  2484.             description of cubic Bezier curves is beyond the scope of this
  2485.             manual.  However, most advanced computer graphics texts
  2486.             contain discussions on this topic.
  2487.  
  2488.             SEE ALSO
  2489.  
  2490.             DRWCIRARC, DRWELLARC
  2491.  
  2492.             EXAMPLE
  2493.  
  2494.             REM SHOW DRWCUBICBEZIER
  2495.             REM $INCLUDE: 'SVGABC.BI'
  2496.             DEFINT A-Z
  2497.  
  2498.             DIM P(3) AS P2DType
  2499.  
  2500.             IF WHICHCPU < 386 THEN END
  2501.             IF WHICHVGA = 0 THEN END
  2502.             IF RES640 <> 1 THEN
  2503.                DUMMY = RESTEXT
  2504.                END
  2505.             END IF
  2506.  
  2507.             P(0).X = 260
  2508.             P(0).Y = 240
  2509.  
  2510.             P(1).X = 310
  2511.             P(1).Y = 360
  2512.  
  2513.  
  2514.  
  2515.                                                                          39
  2516.  
  2517.  
  2518.  
  2519.  
  2520.  
  2521.             P(2).X = 330
  2522.             P(2).Y = 120
  2523.  
  2524.             P(3).X = 380
  2525.             P(3).Y = 240
  2526.  
  2527.             DRWCIRCLE 1, 12, P(0).X, P(0).Y, 2
  2528.             DRWCIRCLE 1, 12, P(1).X, P(1).Y, 2
  2529.             DRWCIRCLE 1, 12, P(2).X, P(2).Y, 2
  2530.             DRWCIRCLE 1, 12, P(3).X, P(3).Y, 2
  2531.  
  2532.             DRWCUBICBEZIER 1, 15, P(0).X, P(1).X, P(2).X, P(3).X
  2533.  
  2534.             WHILE INKEY$ = ""
  2535.             WEND
  2536.             DUMMY = RESTEXT
  2537.             CLS
  2538.             END
  2539.  
  2540.  
  2541.  
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548.  
  2549.  
  2550.  
  2551.  
  2552.  
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.                                                                          40
  2578.  
  2579.  
  2580.  
  2581.  
  2582.  
  2583.           DRWELLARC
  2584.  
  2585.             PROTOTYPE
  2586.  
  2587.             SUB DRWELLARC (Mode%, Color%, Xcenter%, Ycenter%, RadiusX%,
  2588.             RadiusX%, StartAng&, EndAng&)
  2589.  
  2590.             INPUT
  2591.  
  2592.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2593.             Color - index to color in current palette
  2594.             Xcenter, Ycenter - location of center of ellipse
  2595.             RadiusX - radius parallel to X axis
  2596.             RadiusY - radius parallel to Y axis
  2597.             StartAng, EndAng - start and end angles in degrees
  2598.  
  2599.             OUTPUT
  2600.  
  2601.             no value returned
  2602.  
  2603.             USAGE
  2604.  
  2605.             DRWELLARC draws an elliptical arc of the specified color and
  2606.             mode with the center located at (Xcenter, Ycenter).  The
  2607.             radius in the horizontal direction is RaduisX and the radius
  2608.             in the vertical direction is RadiusY.  The starting angle is
  2609.             specified by StartAng and ends at the angle specified by
  2610.             EndAng.  All values of Xcenter, Ycenter, RadiusX, RadiusY,
  2611.             StartAng and EndAng are valid.  However, StartAng must be less
  2612.             than EndAng.  Any portion of the arc that lies outside of the
  2613.             currently defined viewport will not be drawn.
  2614.  
  2615.             SEE ALSO
  2616.  
  2617.             DRWCIRARC, DRWELLIPSE
  2618.  
  2619.             EXAMPLE
  2620.  
  2621.             REM DRAWS SOME ELLIPTICAL ARCS
  2622.             REM $INCLUDE: 'SVGABC.BI'
  2623.             DEFINT A-Z
  2624.  
  2625.             IF WHICHVGA = 0 THEN END
  2626.             DUMMY = RES640
  2627.             FOR I = 1 TO 60
  2628.                RX = I * 5
  2629.                RY = I * 3
  2630.                SANG = I * 6
  2631.                DRWELLARC 1, 10, GETMAXX \ 2, GETMAXY \ 2, RX, RY, SANG, 360
  2632.             NEXT I
  2633.             WHILE INKEY$ = ""
  2634.             WEND
  2635.             DUMMY = RESTEXT
  2636.             CLS
  2637.  
  2638.  
  2639.                                                                          41
  2640.  
  2641.  
  2642.  
  2643.  
  2644.  
  2645.             END
  2646.  
  2647.  
  2648.  
  2649.  
  2650.  
  2651.  
  2652.  
  2653.  
  2654.  
  2655.  
  2656.  
  2657.  
  2658.  
  2659.  
  2660.  
  2661.  
  2662.  
  2663.  
  2664.  
  2665.  
  2666.  
  2667.  
  2668.  
  2669.  
  2670.  
  2671.  
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.  
  2699.  
  2700.  
  2701.                                                                          42
  2702.  
  2703.  
  2704.  
  2705.  
  2706.  
  2707.             DRWELLIPSE
  2708.  
  2709.             PROTOTYPE
  2710.  
  2711.             SUB DRWELLIPSE (Mode%, Color%, Xcenter%, Ycenter%, RadiusX%,
  2712.             RadiusY%)
  2713.  
  2714.             INPUT
  2715.  
  2716.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2717.             Color - index to color in current palette
  2718.             Xcenter, Ycenter - location of center of ellipse
  2719.             RadiusX - radius parallel to X axis
  2720.             RadiusY - radius parallel to Y axis
  2721.  
  2722.             OUTPUT
  2723.  
  2724.             no value returned
  2725.  
  2726.             USAGE
  2727.  
  2728.             DRWELLIPSE draws an ellipse of the specified color using Mode
  2729.             with the center defined by (Xcenter, Ycenter).  The radius in
  2730.             the horizontal direction is RaduisX and the radius in the
  2731.             vertical direction is RadiusY.  All values of Xcenter,
  2732.             Ycenter, RadiusX and RadiusY are valid.  Any portion of the
  2733.             ellipse that lies outside of the currently defined viewport
  2734.             will not be drawn.
  2735.  
  2736.             SEE ALSO
  2737.  
  2738.             DRWCIRCLE, DRWELLARC, DRWFILLELLIPSE, SETVIEW
  2739.  
  2740.             EXAMPLE
  2741.  
  2742.             REM DRAWS AN ELLIPSE AT THE CENTER OF THE SCREEN
  2743.             REM $INCLUDE: 'SVGABC.BI'
  2744.             DEFINT A-Z
  2745.  
  2746.             VMODE=VIDEOMODEGET
  2747.             IF WHICHVGA = 0 THEN STOP
  2748.             DUMMY=RES640
  2749.             DRWELLIPSE 1, 10, 320, 240, 318, 238
  2750.             WHILE INKEY$ = ""
  2751.             WEND
  2752.             VIDEOMODESET VMODE
  2753.             END
  2754.  
  2755.  
  2756.  
  2757.  
  2758.  
  2759.  
  2760.  
  2761.  
  2762.  
  2763.                                                                          43
  2764.  
  2765.  
  2766.  
  2767.  
  2768.  
  2769.           DRWFILLBOX
  2770.  
  2771.             PROTOTYPE
  2772.  
  2773.             SUB DRWFILLBOX (Mode%, Color%, X1%, Y1%, X2%, Y2%)
  2774.  
  2775.             INPUT
  2776.  
  2777.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2778.             Color - index to color in current palette
  2779.             X1, Y1 - location of top left corner
  2780.             X2, Y2 - location of bottom right corner
  2781.  
  2782.             OUTPUT
  2783.  
  2784.             no value returned
  2785.  
  2786.             USAGE
  2787.  
  2788.             DRWFILLBOX draws a filled rectangle of the color specified
  2789.             using Mode with opposite vertices defined by (X1, Y1) and (X2,
  2790.             Y2).  The vertices given do not need to be exactly the top
  2791.             left and bottom right.  They only have to reference opposite
  2792.             sides of the rectangle.  Any portion of the rectangle that
  2793.             lies outside of the currently defined viewport will not be
  2794.             drawn.
  2795.  
  2796.             SEE ALSO
  2797.  
  2798.             DRWBOX, DRWLINE, FILLCONVEXPOLY, FILLPOLY, SETVIEW
  2799.  
  2800.             EXAMPLE
  2801.  
  2802.             REM DRAWS A FILLED BOX
  2803.             REM $INCLUDE: 'SVGABC.BI'
  2804.             DEFINT A-Z
  2805.  
  2806.             VMODE = VIDEOMODEGET
  2807.             IF WHICHVGA = 0 THEN STOP
  2808.             DUMMY = RES640
  2809.             DRWFILLBOX 1, 10, 100, 100, 200, 200
  2810.             WHILE INKEY$ = ""
  2811.             WEND
  2812.             VIDEOMODESET VMODE
  2813.             END
  2814.  
  2815.  
  2816.  
  2817.  
  2818.  
  2819.  
  2820.  
  2821.  
  2822.  
  2823.  
  2824.  
  2825.                                                                          44
  2826.  
  2827.  
  2828.  
  2829.  
  2830.  
  2831.           DRWFILLCIRCLE
  2832.  
  2833.             PROTOTYPE
  2834.  
  2835.             SUB DRWFILLCIRCLE (Mode%, Color%, Xcenter%, Ycenter%, Radius%)
  2836.  
  2837.             INPUT
  2838.  
  2839.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2840.             Color - index to color in current palette
  2841.             Xcenter, Ycenter - location of center of circle
  2842.             Radius - distance from center to edge of circle
  2843.  
  2844.             OUTPUT
  2845.  
  2846.             no value returned
  2847.  
  2848.             USAGE
  2849.  
  2850.             DRWFILLCIRCLE draws a filled circle of the specified color
  2851.             using Mode with the center located at (Xcenter, Ycenter) and a
  2852.             radius of Radius.  All values of Xcenter, Ycenter and Radius
  2853.             are valid.  Any portion of the circle that lies outside of the
  2854.             currently defined viewport will not be drawn.
  2855.  
  2856.             SEE ALSO
  2857.  
  2858.             DRWCIRCLE, SETVIEW
  2859.  
  2860.             EXAMPLE
  2861.  
  2862.             REM DRAWS A FILLED CIRCLE
  2863.             REM $INCLUDE: 'SVGABC.BI'
  2864.             DEFINT A-Z
  2865.  
  2866.             VMODE = VIDEOMODEGET
  2867.             IF WHICHVGA = 0 THEN STOP
  2868.             DUMMY = RES640
  2869.             DRWFILLCIRCLE 1, 10, 320, 240, 50
  2870.             WHILE INKEY$ = ""
  2871.             WEND
  2872.             VIDEOMODESET VMODE
  2873.             END
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880.  
  2881.  
  2882.  
  2883.  
  2884.  
  2885.  
  2886.  
  2887.                                                                          45
  2888.  
  2889.  
  2890.  
  2891.  
  2892.  
  2893.           DRWFILLELLIPSE
  2894.  
  2895.             PROTOTYPE
  2896.  
  2897.             SUB DRWFILLELLIPSE (Mode%, Color%, Xcenter%, Ycenter%,
  2898.             RadiusX%, RadiusY%)
  2899.  
  2900.             INPUT
  2901.  
  2902.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2903.             Color - index to color in current palette
  2904.             Xcenter, Ycenter - location of center of ellipse
  2905.             RadiusX - radius parallel to X axis
  2906.             RadiusY - radius parallel to Y axis
  2907.  
  2908.             OUTPUT
  2909.  
  2910.             no value returned
  2911.  
  2912.             USAGE
  2913.  
  2914.             DRWFILLELLIPSE draws a filled ellipse of the specified color
  2915.             using Mode with the center defined by (Xcenter, Ycenter).  The
  2916.             radius in the horizontal direction is RaduisX and the radius
  2917.             in the vertical direction is RadiusY.  All values of Xcenter,
  2918.             Ycenter, RadiusX and RadiusY are valid.  Any portion of the
  2919.             ellipse that lies outside of the currently defined viewport
  2920.             will not be drawn.
  2921.  
  2922.             SEE ALSO
  2923.  
  2924.             DRWELLIPSE, SETVIEW
  2925.  
  2926.             EXAMPLE
  2927.  
  2928.             REM DRAWS A FILLED ELLIPSE
  2929.             REM $INCLUDE: 'SVGABC.BI'
  2930.             DEFINT A-Z
  2931.  
  2932.             VMODE = VIDEOMODEGET
  2933.             IF WHICHVGA = 0 THEN STOP
  2934.             DUMMY = RES640
  2935.             DRWFILLELLIPSE 1, 10, 320, 240, 118, 50
  2936.             WHILE INKEY$ = ""
  2937.             WEND
  2938.             VIDEOMODESET VMODE
  2939.             END
  2940.  
  2941.  
  2942.  
  2943.  
  2944.  
  2945.  
  2946.  
  2947.  
  2948.  
  2949.                                                                          46
  2950.  
  2951.  
  2952.  
  2953.  
  2954.  
  2955.           DRWLINE
  2956.  
  2957.             PROTOTYPE
  2958.  
  2959.             SUB DRWLINE (Mode%, Color%, X1%, Y1%, X2%, Y2%)
  2960.  
  2961.             INPUT
  2962.  
  2963.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  2964.             Color - index to color in current palette
  2965.             X1, Y1 - location of one endpoint of line
  2966.             X2, Y2 - location of other endpoint of line
  2967.  
  2968.             OUTPUT
  2969.  
  2970.             no value returned
  2971.  
  2972.             USAGE
  2973.  
  2974.             DRWLINE draws a line of the specified color using Mode with
  2975.             endpoints located at (X1, Y1) and (X2, Y2).  All values of X1,
  2976.             Y1, X2 and Y2 are valid.  Any portion of the line that lies
  2977.             outside of the currently defined viewport will not be drawn.
  2978.  
  2979.             SEE ALSO
  2980.  
  2981.             DRWALINE, DRWBOX, SETVIEW
  2982.  
  2983.             EXAMPLE
  2984.  
  2985.             REM DRAWS A LINE FROM 0,0 TO THE CENTER OF THE SCREEN
  2986.             REM $INCLUDE: 'SVGABC.BI'
  2987.             DEFINT A-Z
  2988.  
  2989.             VMODE=VIDEOMODEGET
  2990.             IF WHICHVGA = 0 THEN STOP
  2991.             DUMMY=RES640
  2992.             DRWLINE 1, 10, 0, 0, 320, 240
  2993.             WHILE INKEY$ = ""
  2994.             WEND
  2995.             VIDEOMODESET VMODE
  2996.             END
  2997.  
  2998.  
  2999.  
  3000.  
  3001.  
  3002.  
  3003.  
  3004.  
  3005.  
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011.                                                                          47
  3012.  
  3013.  
  3014.  
  3015.  
  3016.  
  3017.           DRWPOINT
  3018.  
  3019.             PROTOTYPE
  3020.  
  3021.             SUB DRWPOINT (Mode%, Color%, X%, Y%)
  3022.  
  3023.             INPUT
  3024.  
  3025.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  3026.             Color - index to color in current palette
  3027.             X, Y - location of pixel to write
  3028.  
  3029.             OUTPUT
  3030.  
  3031.             no value returned
  3032.  
  3033.             USAGE
  3034.  
  3035.             DRWPOINT draws a single point of the specified color using
  3036.             Mode at (X, Y).  All values of X and Y are valid.  If the
  3037.             point (X, Y) lies outside of the currently defined viewport,
  3038.             no drawing will take place.
  3039.  
  3040.             SEE ALSO
  3041.  
  3042.             GETPOINT, SETVIEW
  3043.  
  3044.             EXAMPLE
  3045.  
  3046.             REM DRAWS A POINT AT THE CENTER OF THE SCREEN
  3047.             REM $INCLUDE: 'SVGABC.BI'
  3048.             DEFINT A-Z
  3049.  
  3050.             VMODE=VIDEOMODEGET
  3051.             IF WHICHVGA = 0 THEN STOP
  3052.             DUMMY=RES640
  3053.             DRWPOINT 1, 10, 320, 240
  3054.             WHILE INKEY$ = ""
  3055.             WEND
  3056.             VIDEOMODESET VMODE
  3057.             END
  3058.  
  3059.  
  3060.  
  3061.  
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.                                                                          48
  3074.  
  3075.  
  3076.  
  3077.  
  3078.  
  3079.           DRWSTRING
  3080.  
  3081.             PROTOTYPE
  3082.  
  3083.             SUB DRWSTRING (Mode%, FColor%, BColor%, Strng$, X%, Y%)
  3084.  
  3085.             INPUT
  3086.  
  3087.             Mode - pixel write mode (no action=0, SET=1, XOR=2, OR=3,
  3088.             AND=4)
  3089.             FColor - foreground index to color in current palette
  3090.             BColor - background index to color in current palette
  3091.             Strng$ - string of ASCII characters to be drawn
  3092.             X, Y - location of upper, left corner of block
  3093.  
  3094.             OUTPUT
  3095.  
  3096.             no value returned
  3097.  
  3098.             USAGE
  3099.  
  3100.             DRWSTRING takes the ASCII characters contained in Strng$ and
  3101.             creates a graphics block similar to the blocks used by Blkget
  3102.             and Blkput and places this block on the screen at the
  3103.             specified coordinates.  The characters are drawn with color
  3104.             FColor using the current font and the background is color
  3105.             BColor.  When mode 0, no action, is used, the graphics block
  3106.             is created in memory retrievable by GETLASTSTRING, but no text
  3107.             is actually drawn on the screen.  (Note: the system font is
  3108.             automatically installed when WHICHVGA is called.)
  3109.  
  3110.             SEE ALSO
  3111.  
  3112.             FONTSET, FONTGETINFO, FONTSYSTEM, DRWSTRINGDN, DRWSTRINGLT,
  3113.             DRWSTRINGRT, GETLASTSTRING
  3114.  
  3115.             EXAMPLE
  3116.  
  3117.             REM DRAWS SOME NORMAL TEXT AT THE CENTER OF THE SCREEN
  3118.             REM $INCLUDE: 'SVGABC.BI'
  3119.             DEFINT A-Z
  3120.  
  3121.             VMODE=VIDEOMODEGET
  3122.             IF WHICHVGA = 0 THEN STOP
  3123.             DUMMY=RES640
  3124.             A$ = "HELLO WORLD"
  3125.             DRWSTRING 1, 10, 0, A$, 320, 240
  3126.             WHILE INKEY$ = ""
  3127.             WEND
  3128.             VIDEOMODESET VMODE
  3129.             END
  3130.  
  3131.  
  3132.  
  3133.  
  3134.  
  3135.                                                                          49
  3136.  
  3137.  
  3138.  
  3139.  
  3140.  
  3141.           DRWSTRINGDN
  3142.  
  3143.             PROTOTYPE
  3144.  
  3145.             SUB DRWSTRINGDN (Mode%, FColor%, BColor%, Strng$, X%, Y%)
  3146.  
  3147.             INPUT
  3148.  
  3149.             Mode - pixel write mode (no action=0, SET=1, XOR=2, OR=3,
  3150.             AND=4)
  3151.             FColor - foreground index to color in current palette
  3152.             BColor - background index to color in current palette
  3153.             Strng$ - string of ASCII characters to be drawn
  3154.             X, Y - location of lower, right corner of block
  3155.  
  3156.             OUTPUT
  3157.  
  3158.             no value returned
  3159.  
  3160.             USAGE
  3161.  
  3162.             DRWSTRINGDN takes the ASCII characters contained in Strng$ and
  3163.             creates a graphics block similar to the blocks used by Blkget
  3164.             and Blkput.  The characters are drawn with color FColor using
  3165.             the current font and the background is color BColor.  When
  3166.             mode 0, no action, is used, the graphics block is created in
  3167.             memory retrievable by GETLASTSTRING, but no text is actually
  3168.             drawn on the screen.  (Note: the system font is automatically
  3169.             installed when WHICHVGA is called.)  The text is drawn upside
  3170.             down with X, Y specifying the lower, right corner.  This
  3171.             corner corresponds to the upper, left corner when the text is
  3172.             oriented upright.
  3173.  
  3174.             SEE ALSO
  3175.  
  3176.             FONTSET, FONTGETINFO, FONTSYSTEM, DRWSTRING, DRWSTRINGLT,
  3177.             DRWSTRINGRT, GETLASTSTRING
  3178.  
  3179.             EXAMPLE
  3180.  
  3181.             REM DRAWS SOME UP-SIDE-DOWN TEXT AT THE CENTER OF THE SCREEN
  3182.             REM $INCLUDE: 'SVGABC.BI'
  3183.             DEFINT A-Z
  3184.  
  3185.             VMODE=VIDEOMODEGET
  3186.             IF WHICHVGA = 0 THEN STOP
  3187.             DUMMY=RES640
  3188.             A$ = "HELLO WORLD"
  3189.             DRWSTRINGDN 1, 10, 0, A$, 320, 240
  3190.             WHILE INKEY$ = ""
  3191.             WEND
  3192.             VIDEOMODESET VMODE
  3193.             END
  3194.  
  3195.  
  3196.  
  3197.                                                                          50
  3198.  
  3199.  
  3200.  
  3201.  
  3202.  
  3203.           DRWSTRINGLT
  3204.  
  3205.             PROTOTYPE
  3206.  
  3207.             SUB DRWSTRINGLT (Mode%, FColor%, BColor%, Strng$, X%, Y%)
  3208.  
  3209.             INPUT
  3210.  
  3211.             Mode - pixel write mode (no action=0, SET=1, XOR=2, OR=3,
  3212.             AND=4)
  3213.             FColor - foreground index to color in current palette
  3214.             BColor - background index to color in current palette
  3215.             Strng$ - string of ASCII characters to be drawn
  3216.             X, Y - location of lower, left corner of block
  3217.  
  3218.             OUTPUT
  3219.  
  3220.             no value returned
  3221.  
  3222.             USAGE
  3223.  
  3224.             DRWSTRINGLT takes the ASCII characters contained in Strng$ and
  3225.             creates a graphics block similar to the blocks used by Blkget
  3226.             and Blkput.  The characters are drawn with color FColor using
  3227.             the current font and the background is color BColor.  When
  3228.             mode 0, no action, is used, the graphics block is created in
  3229.             memory retrievable by GETLASTSTRING, but no text is actually
  3230.             drawn on the screen.  (Note: the system font is automatically
  3231.             installed when WHICHVGA is called.)  The text block is rotated
  3232.             90 to the left with X, Y specifying the lower, left corner.
  3233.             This corner corresponds to the upper, left corner when the
  3234.             text is oriented upright.
  3235.  
  3236.  
  3237.             SEE ALSO
  3238.  
  3239.             FONTSET, FONTGETINFO, FONTSYSTEM, DRWSTRING, DRWSTRINGDN,
  3240.             DRWSTRINGRT, GETLASTSTRING
  3241.  
  3242.             EXAMPLE
  3243.  
  3244.             REM DRAWS SOME TEXT ROTATED BY 90 DEGREES TO THE LEFT AT THE
  3245.             REM CENTER OF THE SCREEN
  3246.             REM $INCLUDE: 'SVGABC.BI'
  3247.             DEFINT A-Z
  3248.  
  3249.             VMODE=VIDEOMODEGET
  3250.             IF WHICHVGA = 0 THEN STOP
  3251.             DUMMY=RES640
  3252.             A$ = "HELLO WORLD"
  3253.             DRWSTRINGLT 1, 10, 0, A$, 320, 240
  3254.             WHILE INKEY$ = ""
  3255.             WEND
  3256.             VIDEOMODESET VMODE
  3257.  
  3258.  
  3259.                                                                          51
  3260.  
  3261.  
  3262.  
  3263.  
  3264.  
  3265.             END
  3266.  
  3267.  
  3268.  
  3269.  
  3270.  
  3271.  
  3272.  
  3273.  
  3274.  
  3275.  
  3276.  
  3277.  
  3278.  
  3279.  
  3280.  
  3281.  
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290.  
  3291.  
  3292.  
  3293.  
  3294.  
  3295.  
  3296.  
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302.  
  3303.  
  3304.  
  3305.  
  3306.  
  3307.  
  3308.  
  3309.  
  3310.  
  3311.  
  3312.  
  3313.  
  3314.  
  3315.  
  3316.  
  3317.  
  3318.  
  3319.  
  3320.  
  3321.                                                                          52
  3322.  
  3323.  
  3324.  
  3325.  
  3326.  
  3327.           DRWSTRINGRT
  3328.  
  3329.             PROTOTYPE
  3330.  
  3331.             SUB DRWSTRINGRT (Mode%, FColor%, BColor%, Strng$, X%, Y%)
  3332.  
  3333.             INPUT
  3334.  
  3335.             Mode - pixel write mode (no action=0, SET=1, XOR=2, OR=3,
  3336.             AND=4)
  3337.             FColor - foreground index to color in current palette
  3338.             BColor - background index to color in current palette
  3339.             Strng$ - string of ASCII characters to be drawn
  3340.             X, Y - location of upper, right corner of block
  3341.  
  3342.             OUTPUT
  3343.  
  3344.             no value returned
  3345.  
  3346.             USAGE
  3347.  
  3348.             DRWSTRINGRT takes the ASCII characters contained in Strng$ and
  3349.             creates a graphics block similar to the blocks used by Blkget
  3350.             and Blkput.  The characters are drawn with color FColor using
  3351.             the current font and the background is color BColor.  When
  3352.             mode 0, no action, is used, the graphics block is created in
  3353.             memory retrievable by GETLASTSTRING, but no text is actually
  3354.             drawn on the screen.  (Note: the system font is automatically
  3355.             installed when WHICHVGA is called.)  The text block is rotated
  3356.             90 to the right with X, Y specifying the upper, right corner.
  3357.             This corner corresponds to the upper, left corner if the text
  3358.             is oriented upright.
  3359.  
  3360.  
  3361.             SEE ALSO
  3362.  
  3363.             FONTSET, FONTGETINFO, FONTSYSTEM, DRWSTRING, DRWSTRINGDN,
  3364.             DRWSTRINGLT, GETLASTSTRING
  3365.  
  3366.             EXAMPLE
  3367.  
  3368.             REM DRAWS SOME TEXT ROTATED BY 90 DEGREES TO THE RIGHT AT THE
  3369.             REM CENTER OF THE SCREEN
  3370.             REM $INCLUDE: 'SVGABC.BI'
  3371.             DEFINT A-Z
  3372.  
  3373.             VMODE=VIDEOMODEGET
  3374.             IF WHICHVGA = 0 THEN STOP
  3375.             DUMMY=RES640
  3376.             A$ = "HELLO WORLD"
  3377.             DRWSTRINGRT 1, 10, 0, A$, 320, 240
  3378.             WHILE INKEY$ = ""
  3379.             WEND
  3380.             VIDEOMODESET VMODE
  3381.  
  3382.  
  3383.                                                                          53
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389.             END
  3390.  
  3391.  
  3392.  
  3393.  
  3394.  
  3395.  
  3396.  
  3397.  
  3398.  
  3399.  
  3400.  
  3401.  
  3402.  
  3403.  
  3404.  
  3405.  
  3406.  
  3407.  
  3408.  
  3409.  
  3410.  
  3411.  
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.  
  3418.  
  3419.  
  3420.  
  3421.  
  3422.  
  3423.  
  3424.  
  3425.  
  3426.  
  3427.  
  3428.  
  3429.  
  3430.  
  3431.  
  3432.  
  3433.  
  3434.  
  3435.  
  3436.  
  3437.  
  3438.  
  3439.  
  3440.  
  3441.  
  3442.  
  3443.  
  3444.  
  3445.                                                                          54
  3446.  
  3447.  
  3448.  
  3449.  
  3450.  
  3451.           FILLAREA
  3452.  
  3453.             PROTOTYPE
  3454.  
  3455.             SUB FILLAREA (XSeed%, YSeed%, BorderColor%, FillColor%)
  3456.  
  3457.             INPUT
  3458.  
  3459.             XSeed, YSeed - seed location to start fill
  3460.             BorderColor - index to color in current palette at which
  3461.             filling stops
  3462.             FillColor - index to color in current palette to fill within
  3463.             the border
  3464.  
  3465.             OUTPUT
  3466.  
  3467.             no value returned
  3468.  
  3469.             USAGE
  3470.  
  3471.             FILLAREA fills a region with a new color specified by
  3472.             FillColor.  The region is defined by any line or curve of the
  3473.             color BorderColor or by the edge of the viewport.  All
  3474.             graphics within the region are lost and covered with the
  3475.             FillColor.  The border is not effected.
  3476.  
  3477.             SEE ALSO
  3478.  
  3479.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLCOLOR,
  3480.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  3481.             SETVIEW
  3482.  
  3483.             EXAMPLE
  3484.  
  3485.             REM FILLS A BOX WITH A COLOR
  3486.             REM $INCLUDE: 'SVGABC.BI'
  3487.             DEFINT A-Z
  3488.  
  3489.             VMODE=VIDEOMODEGET
  3490.             IF WHICHVGA = 0 THEN STOP
  3491.             DUMMY=RES640
  3492.             DRWBOX 1, 10, 0, 0, 100, 100
  3493.             FILLAREA 1, 1, 10, 7
  3494.             WHILE INKEY$ = ""
  3495.             WEND
  3496.             VIDEOMODESET VMODE
  3497.             END
  3498.  
  3499.  
  3500.  
  3501.  
  3502.  
  3503.  
  3504.  
  3505.  
  3506.  
  3507.                                                                          55
  3508.  
  3509.  
  3510.  
  3511.  
  3512.  
  3513.           FILLCOLOR
  3514.  
  3515.             PROTOTYPE
  3516.  
  3517.             SUB FILLCOLOR (XSeed%, YSeed%, OldColor%, NewColor%)
  3518.  
  3519.             INPUT
  3520.  
  3521.             XSeed, YSeed - seed location to start fill
  3522.             OldColor - index to color in current palette to change
  3523.             NewColor - index to color in current palette to replace
  3524.             OldColor
  3525.  
  3526.             OUTPUT
  3527.  
  3528.             no value returned
  3529.  
  3530.             USAGE
  3531.  
  3532.             FILLCOLOR replaces every existence of OldColor with NewColor
  3533.             within a region.  The region is defined as any pixel of
  3534.             OldColor which has a path of pixels of OldColor or NewColor
  3535.             with sides touching back to the seed point, (XSeed, YSeed).
  3536.             Therefore, only pixels of OldColor are modified and no other
  3537.             information is changed.
  3538.  
  3539.             SEE ALSO
  3540.  
  3541.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  3542.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  3543.             SETVIEW
  3544.  
  3545.             EXAMPLE
  3546.  
  3547.             REM REPLACES THE BLACK COLOR WITH A NEW COLOR
  3548.             REM $INCLUDE: 'SVGABC.BI'
  3549.             DEFINT A-Z
  3550.  
  3551.             VMODE=VIDEOMODEGET
  3552.             IF WHICHVGA = 0 THEN STOP
  3553.             DUMMY=RES640
  3554.             DRWBOX 1, 10, 0, 0, 100, 100
  3555.             DRWBOX 1, 12, 20, 20, 80, 80
  3556.             FILLCOLOR 1, 1, 0, 7
  3557.             WHILE INKEY$ = ""
  3558.             WEND
  3559.             VIDEOMODESET VMODE
  3560.             END
  3561.  
  3562.  
  3563.  
  3564.  
  3565.  
  3566.  
  3567.  
  3568.  
  3569.                                                                          56
  3570.  
  3571.  
  3572.  
  3573.  
  3574.  
  3575.           FILLCONVEXPOLY
  3576.  
  3577.             PROTOTYPE
  3578.  
  3579.             SUB FILLCONVEXPOLY (PolyColor%, NumPoints%, PointArray%)
  3580.  
  3581.             INPUT
  3582.  
  3583.             PolyColor - index to color in current palette
  3584.             NumPoints - number of points in PointArray
  3585.             PointArray - P2DType array holding points of polygon
  3586.  
  3587.             OUTPUT
  3588.  
  3589.             no value returned
  3590.  
  3591.             USAGE
  3592.  
  3593.             FILLCONVEXPOLY draws a solid polygon outlined by the points
  3594.             given in PointArray.  The points are expected to be
  3595.             consecutive and the resulting polygon should be convex (ie.
  3596.             the polygon should not curve in on itself like a kidney bean).
  3597.             The function also assumes that the last point in the array
  3598.             connects to the first.
  3599.  
  3600.             SEE ALSO
  3601.  
  3602.             D3PROJECT, DRWFILLBOX, FILLAREA, FILLCOLOR, FILLPAGE,
  3603.             FILLPOLY, FILLSCREEN, FILLVIEW
  3604.  
  3605.             EXAMPLE
  3606.  
  3607.             REM SHOW FILLCONVEXPOLY
  3608.             REM $INCLUDE: 'SVGABC.BI'
  3609.             DEFINT A-Z
  3610.             DIM T(0 TO 20) AS P2DType
  3611.  
  3612.             VGA = WHICHVGA
  3613.             DUMMY = RES640
  3614.  
  3615.             FOR I = 0 TO 99
  3616.                T(0).X = RND * GETMAXX
  3617.                T(0).Y = RND * GETMAXY
  3618.                T(1).X = RND * GETMAXX
  3619.                T(1).Y = RND * GETMAXY
  3620.                T(2).X = RND * GETMAXX
  3621.                T(2).Y = RND * GETMAXY
  3622.                C = RND * 15
  3623.                FILLCONVEXPOLY C, 3, T(0).X
  3624.             NEXT I
  3625.  
  3626.             WHILE INKEY$ = ""
  3627.             WEND
  3628.  
  3629.  
  3630.  
  3631.                                                                          57
  3632.  
  3633.  
  3634.  
  3635.  
  3636.  
  3637.             DUMMY = RESTEXT
  3638.             END
  3639.  
  3640.  
  3641.  
  3642.  
  3643.  
  3644.  
  3645.  
  3646.  
  3647.  
  3648.  
  3649.  
  3650.  
  3651.  
  3652.  
  3653.  
  3654.  
  3655.  
  3656.  
  3657.  
  3658.  
  3659.  
  3660.  
  3661.  
  3662.  
  3663.  
  3664.  
  3665.  
  3666.  
  3667.  
  3668.  
  3669.  
  3670.  
  3671.  
  3672.  
  3673.  
  3674.  
  3675.  
  3676.  
  3677.  
  3678.  
  3679.  
  3680.  
  3681.  
  3682.  
  3683.  
  3684.  
  3685.  
  3686.  
  3687.  
  3688.  
  3689.  
  3690.  
  3691.  
  3692.  
  3693.                                                                          58
  3694.  
  3695.  
  3696.  
  3697.  
  3698.  
  3699.           FILLPAGE
  3700.  
  3701.             PROTOTYPE
  3702.  
  3703.             SUB FILLPAGE (Color%)
  3704.  
  3705.             INPUT
  3706.  
  3707.             Color - index to color in current palette
  3708.  
  3709.             OUTPUT
  3710.  
  3711.             no value returned
  3712.  
  3713.             USAGE
  3714.  
  3715.             FILLPAGE clears the currently active page with the specified
  3716.             color.  All information on the page is lost.  (Note, a faster
  3717.             method to clear the page is to call any of the 'RES###'
  3718.             functions.  These reset the graphics screen and automatically
  3719.             clear it to color index zero as well as reset the default
  3720.             palette.)
  3721.  
  3722.             SEE ALSO
  3723.  
  3724.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  3725.             FILLCOLOR, FILLCONVEXPOLY, FILLPOLY, FILLSCREEN, FILLVIEW
  3726.  
  3727.             EXAMPLE
  3728.  
  3729.             REM FILLS THE CURRENT VIDEO PAGE WITH A COLOR
  3730.             REM $INCLUDE: 'SVGABC.BI'
  3731.             DEFINT A-Z
  3732.  
  3733.             VMODE=VIDEOMODEGET
  3734.             IF WHICHVGA = 0 THEN STOP
  3735.             DUMMY=RES640
  3736.             DUMMY=PAGEACTIVE(0)
  3737.             FILLPAGE 10
  3738.             WHILE INKEY$ = ""
  3739.             WEND
  3740.             VIDEOMODESET VMODE
  3741.             END
  3742.  
  3743.  
  3744.  
  3745.  
  3746.  
  3747.  
  3748.  
  3749.  
  3750.  
  3751.  
  3752.  
  3753.  
  3754.  
  3755.                                                                          59
  3756.  
  3757.  
  3758.  
  3759.  
  3760.  
  3761.           FILLPOLY
  3762.  
  3763.             PROTOTYPE
  3764.  
  3765.             SUB FILLPOLY (PolyColor%, NumPoints%, PointArray%)
  3766.  
  3767.             INPUT
  3768.  
  3769.             PolyColor - index to color in current palette
  3770.             NumPoints - number of points in PointArray
  3771.             PointArray - P2DType array holding points of polygon
  3772.  
  3773.             OUTPUT
  3774.  
  3775.             no value returned
  3776.  
  3777.             USAGE
  3778.  
  3779.             FILLPOLY draws a solid polygon outlined by the points given in
  3780.             PointArray.  The points are expected to be consecutive.
  3781.             However, there are no restrictions on the relative locations
  3782.             of the points.  The polygon may curve in on itself or have
  3783.             crossed lines.  The function also assumes that the last point
  3784.             in the array connects to the first.  FILLPOLY can be used
  3785.             interchangeably with FILLCONVEXPOLY, although FILLPOLY is
  3786.             slightly slower.
  3787.  
  3788.             Special thanks to Eric Jorgensen for providing the algorithm
  3789.             which formed the basis for FILLPOLY.
  3790.  
  3791.             SEE ALSO
  3792.  
  3793.             D3PROJECT, DRWFILLBOX, FILLAREA, FILLCOLOR, FILLCONVEXPOLY,
  3794.             FILLPAGE, FILLSCREEN, FILLVIEW
  3795.  
  3796.             EXAMPLE
  3797.  
  3798.             REM SHOW FILLPOLY
  3799.             REM $INCLUDE: 'SVGABC.BI'
  3800.             DEFINT A-Z
  3801.  
  3802.             DIM P(4) AS P2DType
  3803.  
  3804.             IF WHICHCPU < 386 THEN END
  3805.             IF WHICHVGA = 0 THEN END
  3806.             IF RES640 <> 1 THEN
  3807.                DUMMY = RESTEXT
  3808.                END
  3809.             END IF
  3810.  
  3811.             P(0).X = 320
  3812.             P(0).Y = 40
  3813.  
  3814.             P(1).X = 203
  3815.  
  3816.  
  3817.                                                                          60
  3818.  
  3819.  
  3820.  
  3821.  
  3822.  
  3823.             P(1).Y = 401
  3824.  
  3825.             P(2).X = 510
  3826.             P(2).Y = 179
  3827.  
  3828.             P(3).X = 130
  3829.             P(3).Y = 179
  3830.  
  3831.             P(4).X = 437
  3832.             P(4).Y = 401
  3833.  
  3834.             FILLPOLY 10, 5, P(0).X
  3835.  
  3836.             WHILE INKEY$ = ""
  3837.             WEND
  3838.             DUMMY = RESTEXT
  3839.             CLS
  3840.             END
  3841.  
  3842.  
  3843.  
  3844.  
  3845.  
  3846.  
  3847.  
  3848.  
  3849.  
  3850.  
  3851.  
  3852.  
  3853.  
  3854.  
  3855.  
  3856.  
  3857.  
  3858.  
  3859.  
  3860.  
  3861.  
  3862.  
  3863.  
  3864.  
  3865.  
  3866.  
  3867.  
  3868.  
  3869.  
  3870.  
  3871.  
  3872.  
  3873.  
  3874.  
  3875.  
  3876.  
  3877.  
  3878.  
  3879.                                                                          61
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885.           FILLSCREEN
  3886.  
  3887.             PROTOTYPE
  3888.  
  3889.             SUB FILLSCREEN (Color%)
  3890.  
  3891.             INPUT
  3892.  
  3893.             Color - index to color in current palette
  3894.  
  3895.             OUTPUT
  3896.  
  3897.             no value returned
  3898.  
  3899.             USAGE
  3900.  
  3901.             FILLSCREEN clears the entire screen with the specified color.
  3902.             All information on the screen is lost.  (Note, a faster method
  3903.             to clear the screen is to call any of the 'RES###' functions.
  3904.             These reset the graphics screen and automatically clear it to
  3905.             color index zero as well as reset the default palette.)
  3906.  
  3907.             SEE ALSO
  3908.  
  3909.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  3910.             FILLCOLOR, FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLVIEW
  3911.  
  3912.             EXAMPLE
  3913.  
  3914.             REM FILLS THE SCREEN WITH A COLOR
  3915.             REM $INCLUDE: 'SVGABC.BI'
  3916.             DEFINT A-Z
  3917.  
  3918.             VMODE=VIDEOMODEGET
  3919.             IF WHICHVGA = 0 THEN STOP
  3920.             DUMMY=RES640
  3921.             FILLSCREEN 10
  3922.             WHILE INKEY$ = ""
  3923.             WEND
  3924.             VIDEOMODESET VMODE
  3925.             END
  3926.  
  3927.  
  3928.  
  3929.  
  3930.  
  3931.  
  3932.  
  3933.  
  3934.  
  3935.  
  3936.  
  3937.  
  3938.  
  3939.  
  3940.  
  3941.                                                                          62
  3942.  
  3943.  
  3944.  
  3945.  
  3946.  
  3947.           FILLVIEW
  3948.  
  3949.             PROTOTYPE
  3950.  
  3951.             SUB FILLVIEW (Color%)
  3952.  
  3953.             INPUT
  3954.  
  3955.             Color - index to color in current palette
  3956.  
  3957.             OUTPUT
  3958.  
  3959.             no value returned
  3960.  
  3961.             USAGE
  3962.  
  3963.             FILLVIEW fills the currently defined viewport with the
  3964.             specified color.  All information in the viewport is lost.
  3965.  
  3966.             SEE ALSO
  3967.  
  3968.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  3969.             FILLCOLOR, FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN,
  3970.             SETVIEW
  3971.  
  3972.             EXAMPLE
  3973.  
  3974.             REM FILLS THE VIEWPORT WITH A COLOR
  3975.             REM $INCLUDE: 'SVGABC.BI'
  3976.             DEFINT A-Z
  3977.  
  3978.             VMODE=VIDEOMODEGET
  3979.             IF WHICHVGA = 0 THEN STOP
  3980.             DUMMY=RES640
  3981.             SETVIEW 100, 100, 539, 379
  3982.             FILLVIEW 10
  3983.             WHILE INKEY$ = ""
  3984.             WEND
  3985.             VIDEOMODESET VMODE
  3986.             END
  3987.  
  3988.  
  3989.  
  3990.  
  3991.  
  3992.  
  3993.  
  3994.  
  3995.  
  3996.  
  3997.  
  3998.  
  3999.  
  4000.  
  4001.  
  4002.  
  4003.                                                                          63
  4004.  
  4005.  
  4006.  
  4007.  
  4008.  
  4009.           FONTGETINFO
  4010.  
  4011.             PROTOTYPE
  4012.  
  4013.             SUB FONTGETINFO (Width%, Height%)
  4014.  
  4015.             INPUT
  4016.  
  4017.             no input parameters
  4018.  
  4019.             OUTPUT
  4020.  
  4021.             no value returned
  4022.             Width - width in pixels of current font
  4023.             Height - height in pixels of current font
  4024.  
  4025.             USAGE
  4026.  
  4027.             FONTGETINFO returns in Width and Height the dimensions of the
  4028.             currently loaded font.
  4029.  
  4030.             SEE ALSO
  4031.  
  4032.             FONTSET, FONTSYSTEM
  4033.  
  4034.             EXAMPLE
  4035.  
  4036.             REM GET INFO ON THE SYSTEM FONT
  4037.             REM $INCLUDE: 'SVGABC.BI'
  4038.             DEFINT A-Z
  4039.  
  4040.             VMODE=VIDEOMODEGET
  4041.             IF WHICHVGA = 0 THEN STOP
  4042.             DUMMY=RES640
  4043.             FONTGETINFO WDTH, HGTH
  4044.             A$ = "SYSTEM FONT WIDTH =" + STR$(WDTH)
  4045.             B$ = "SYSTEM FONT HEIGHT =" + STR$(HGTH)
  4046.             DRWSTRING 1, 7, 0, A$, 0, 0
  4047.             DRWSTRING 1, 7, 0, B$, 0, 20
  4048.             WHILE INKEY$ = ""
  4049.             WEND
  4050.             VIDEOMODESET VMODE
  4051.             END
  4052.  
  4053.  
  4054.  
  4055.  
  4056.  
  4057.  
  4058.  
  4059.  
  4060.  
  4061.  
  4062.  
  4063.  
  4064.  
  4065.                                                                          64
  4066.  
  4067.  
  4068.  
  4069.  
  4070.  
  4071.           FONTSET
  4072.  
  4073.             PROTOTYPE
  4074.  
  4075.             SUB FONTSET (Font$)
  4076.  
  4077.             INPUT
  4078.  
  4079.             Font$ - string * 4098 containing font data
  4080.  
  4081.             OUTPUT
  4082.  
  4083.             no value returned
  4084.  
  4085.             USAGE
  4086.  
  4087.             FONTSET loads the current font with the data in Font$.  The
  4088.             string must have at least 4098 members.  The first byte of
  4089.             Font$ holds the font width (1 to 8) and the second byte holds
  4090.             the font height (1 to 16).  The remaining 4096 bytes are the
  4091.             character raster data, 16 bytes per character.
  4092.  
  4093.             SEE ALSO
  4094.  
  4095.             FONTGETINFO, FONTSYSTEM
  4096.  
  4097.             EXAMPLE
  4098.  
  4099.             See FONTSYSTEM
  4100.  
  4101.  
  4102.  
  4103.  
  4104.  
  4105.  
  4106.  
  4107.  
  4108.  
  4109.  
  4110.  
  4111.  
  4112.  
  4113.  
  4114.  
  4115.  
  4116.  
  4117.  
  4118.  
  4119.  
  4120.  
  4121.  
  4122.  
  4123.  
  4124.  
  4125.  
  4126.  
  4127.                                                                          65
  4128.  
  4129.  
  4130.  
  4131.  
  4132.  
  4133.           FONTSYSTEM
  4134.  
  4135.             PROTOTYPE
  4136.  
  4137.             SUB FONTSYSTEM ()
  4138.  
  4139.             INPUT
  4140.  
  4141.             no input parameters
  4142.  
  4143.             OUTPUT
  4144.  
  4145.             no value returned
  4146.  
  4147.             USAGE
  4148.  
  4149.             FONTSYSTEM sets the current font to the standard system font.
  4150.             This font is automatically set when WHICHVGA is called.
  4151.  
  4152.             SEE ALSO
  4153.  
  4154.             WHICHVGA, FONTGETINFO, FONTSET
  4155.  
  4156.             EXAMPLE
  4157.  
  4158.             REM LOAD A FONT FROM DISK AND ENABLE IT
  4159.             REM THEN GO BACK TO THE SYSTEM FONT
  4160.             REM $INCLUDE: 'SVGABC.BI'
  4161.             DEFINT A-Z
  4162.  
  4163.             DIM NEWFONT AS STRING * 4098
  4164.  
  4165.             VMODE = VIDEOMODEGET
  4166.             IF WHICHVGA = 0 THEN STOP
  4167.             DUMMY=RES640
  4168.             OPEN "DRAGON.FNT" FOR BINARY AS #1
  4169.             GET #1, , NEWFONT
  4170.             CLOSE #1
  4171.             FONTSET NEWFONT
  4172.             DRWSTRING 1, 7, 0, "The Dragon Font!", 0, 0
  4173.             FONTSYSTEM
  4174.             DRWSTRING 1, 7, 0, "The System Font!", 0, 20
  4175.             WHILE INKEY$ = ""
  4176.             WEND
  4177.             VIDEOMODESET VMODE
  4178.             END
  4179.  
  4180.  
  4181.  
  4182.  
  4183.  
  4184.  
  4185.  
  4186.  
  4187.  
  4188.  
  4189.                                                                          66
  4190.  
  4191.  
  4192.  
  4193.  
  4194.  
  4195.           GETARCCOS
  4196.  
  4197.             PROTOTYPE
  4198.  
  4199.             FUNCTION GETARCCOS% (Value&)
  4200.  
  4201.             INPUT
  4202.  
  4203.             Value - number between -1 and +1 scaled up by 13 bits (8192)
  4204.  
  4205.             OUTPUT
  4206.  
  4207.             GETARCCOS returns the arc cosine of Value in degrees.
  4208.  
  4209.             USAGE
  4210.  
  4211.             GETARCCOS returns the arc cosine in degrees for the given
  4212.             value.  The return will be between 0 and 180 degrees.  Value
  4213.             should be between -8192 and +8192 representing the range -1 to
  4214.             +1.  Input values outside this range are invalid and GETARCCOS
  4215.             will return -32768. Floating point values are ignored.  This
  4216.             function uses an integer lookup table stored within the
  4217.             library in order to produce the fastest possible results.  No
  4218.             floating point arithmetic is used.  The scale factor of 13
  4219.             bits (8192) was chosen because this is the number of bits at
  4220.             which every change of one degree gives a change in the value
  4221.             of the sine (or cosine) function.
  4222.  
  4223.             SEE ALSO
  4224.  
  4225.             GETARCSIN, GETARCTAN, GETCOS, GETSIN, GETTAN
  4226.  
  4227.             EXAMPLE
  4228.  
  4229.             REM SHOW GETARCCOS
  4230.             REM $INCLUDE: 'SVGABC.BI'
  4231.             DEFINT A-Z
  4232.  
  4233.             VMODE = VIDEOMODEGET
  4234.             IF WHICHVGA = 0 THEN STOP
  4235.             DUMMY=RES640
  4236.             DRWBOX 1, 10, 0, 0, 639, 479
  4237.             DRWLINE 1, 10, 0, 240, 639, 240
  4238.             DRWLINE 1, 10, 320, 0, 320, 479
  4239.             DEG2RAD! = 4 * ATN(1) / 180
  4240.             FOR I = -8192 TO 8192 STEP 16
  4241.                Y1& = GETARCCOS(I)
  4242.                DRWPOINT 1, 12, 320 + Y1& * 3, 240 - I / 34
  4243.             NEXT I
  4244.             WHILE INKEY$ = ""
  4245.             WEND
  4246.             VIDEOMODESET VMODE
  4247.             END
  4248.  
  4249.  
  4250.  
  4251.                                                                          67
  4252.  
  4253.  
  4254.  
  4255.  
  4256.  
  4257.           GETARCSIN
  4258.  
  4259.             PROTOTYPE
  4260.  
  4261.             FUNCTION GETARCSIN (Value&)
  4262.  
  4263.             INPUT
  4264.  
  4265.             Value - number between -1 and +1 scaled up by 13 bits (8192)
  4266.  
  4267.             OUTPUT
  4268.  
  4269.             GETARCSIN returns the arc sine of Value in degrees.
  4270.  
  4271.             USAGE
  4272.  
  4273.             GETARCSIN returns the arc sine in degrees for the given value.
  4274.             The return will be between -90 and +90 degrees.  Value should
  4275.             be between -8192 and +8192 representing the range -1 to +1.
  4276.             Input values outside this range are invalid and GETARCSIN will
  4277.             return -32768. Floating point values are ignored.  This
  4278.             function uses an integer lookup table stored within the
  4279.             library in order to produce the fastest possible results.  No
  4280.             floating point arithmetic is used.  The scale factor of 13
  4281.             bits (8192) was chosen because this is the number of bits at
  4282.             which every change of one degree gives a change in the value
  4283.             of the sine (or cosine) function.
  4284.  
  4285.             SEE ALSO
  4286.  
  4287.             GETARCCOS, GETARCTAN, GETCOS, GETSIN, GETTAN
  4288.  
  4289.             EXAMPLE
  4290.  
  4291.             REM SHOW GETARCSIN
  4292.             REM $INCLUDE: 'SVGABC.BI'
  4293.             DEFINT A-Z
  4294.  
  4295.             VMODE = VIDEOMODEGET
  4296.             IF WHICHVGA = 0 THEN STOP
  4297.             DUMMY=RES640
  4298.             DRWBOX 1, 10, 0, 0, 639, 479
  4299.             DRWLINE 1, 10, 0, 240, 639, 240
  4300.             DRWLINE 1, 10, 320, 0, 320, 479
  4301.             DEG2RAD! = 4 * ATN(1) / 180
  4302.             FOR I = -8192 TO 8192 STEP 16
  4303.                Y1& = GETARCSIN(I)
  4304.                DRWPOINT 1, 12, 320 + Y1& * 3, 240 - I / 34
  4305.             NEXT I
  4306.             WHILE INKEY$ = ""
  4307.             WEND
  4308.             VIDEOMODESET VMODE
  4309.             END
  4310.  
  4311.  
  4312.  
  4313.                                                                          68
  4314.  
  4315.  
  4316.  
  4317.  
  4318.  
  4319.           GETARCTAN
  4320.  
  4321.             PROTOTYPE
  4322.  
  4323.             FUNCTION GETARCTAN (Value&)
  4324.  
  4325.             INPUT
  4326.  
  4327.             Value - long integer representing a decimal scaled up by 13
  4328.             bits (8192)
  4329.  
  4330.             OUTPUT
  4331.  
  4332.             GETARCTAN returns the arc tangent of Value in degrees.
  4333.  
  4334.             USAGE
  4335.  
  4336.             GETARCTAN returns the arc cosine in degrees for the given
  4337.             value.  The return will be between -89 and +89 degrees.  Value
  4338.             can be any long integer.  It is interpreted as a decimal
  4339.             scaled up by 8192 (13 bits). Floating point values are
  4340.             ignored.  This function uses an integer lookup table stored
  4341.             within the library in order to produce the fastest possible
  4342.             results.  No floating point arithmetic is used.  The scale
  4343.             factor of 13 bits (8192) was chosen because this is the number
  4344.             of bits at which every change of one degree gives a change in
  4345.             the value of the sine (or cosine) function.
  4346.  
  4347.             SEE ALSO
  4348.  
  4349.             GETARCCOS, GETARCSIN, GETCOS, GETSIN, GETTAN
  4350.  
  4351.             EXAMPLE
  4352.  
  4353.             REM SHOW GETARCTAN
  4354.             REM $INCLUDE: 'SVGABC.BI'
  4355.             DEFINT A-Z
  4356.  
  4357.             VMODE = VIDEOMODEGET
  4358.             IF WHICHVGA = 0 THEN STOP
  4359.             DUMMY=RES640
  4360.             DRWBOX 1, 10, 0, 0, 639, 479
  4361.             DRWLINE 1, 10, 0, 240, 639, 240
  4362.             DRWLINE 1, 10, 320, 0, 320, 479
  4363.             DEG2RAD! = 4 * ATN(1) / 180
  4364.             FOR I = -8192 TO 8192 STEP 16
  4365.                Y1& = GETARCTAN(I)
  4366.                Y2& = ATN(I / 8192) / DEG2RAD!
  4367.                DRWPOINT 1, 12, 320 + Y1& * 6, 240 - I / 34
  4368.                DRWPOINT 1, 15, 320 + Y2& * 6, 240 - I / 34
  4369.             NEXT I
  4370.             WHILE INKEY$ = ""
  4371.             WEND
  4372.             VIDEOMODESET VMODE
  4373.  
  4374.  
  4375.                                                                          69
  4376.  
  4377.  
  4378.  
  4379.  
  4380.  
  4381.             END
  4382.  
  4383.  
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.  
  4390.  
  4391.  
  4392.  
  4393.  
  4394.  
  4395.  
  4396.  
  4397.  
  4398.  
  4399.  
  4400.  
  4401.  
  4402.  
  4403.  
  4404.  
  4405.  
  4406.  
  4407.  
  4408.  
  4409.  
  4410.  
  4411.  
  4412.  
  4413.  
  4414.  
  4415.  
  4416.  
  4417.  
  4418.  
  4419.  
  4420.  
  4421.  
  4422.  
  4423.  
  4424.  
  4425.  
  4426.  
  4427.  
  4428.  
  4429.  
  4430.  
  4431.  
  4432.  
  4433.  
  4434.  
  4435.  
  4436.  
  4437.                                                                          70
  4438.  
  4439.  
  4440.  
  4441.  
  4442.  
  4443.           GETCOS
  4444.  
  4445.             PROTOTYPE
  4446.  
  4447.             FUNCTION GETCOS& (Angle&)
  4448.  
  4449.             INPUT
  4450.  
  4451.             Angle - angle in degrees
  4452.  
  4453.             OUTPUT
  4454.  
  4455.             GETCOS returns the cosine of Angle scaled up by 13 bits
  4456.             (8192).
  4457.  
  4458.             USAGE
  4459.  
  4460.             GETCOS returns the cosine of the specified angle.  Angle can
  4461.             be any long value; floating point values are ignored.  The
  4462.             return value has been multiplied by 8192.  This function uses
  4463.             an integer lookup table stored within the library in order to
  4464.             produce the fastest possible results.  No floating point
  4465.             arithmetic is used.  The scale factor of 13 bits (8192) was
  4466.             chosen because this is the number of bits at which every
  4467.             change of one degree gives a change in the value of the sine
  4468.             (or cosine) function.
  4469.  
  4470.             SEE ALSO
  4471.  
  4472.             GETARCCOS, GETARCSIN, GETARCTAN, GETSIN, GETTAN
  4473.  
  4474.             EXAMPLE
  4475.  
  4476.             REM SHOW GETCOS
  4477.             REM $INCLUDE: 'SVGABC.BI'
  4478.             DEFINT A-Z
  4479.  
  4480.             VMODE = VIDEOMODEGET
  4481.             IF WHICHVGA = 0 THEN STOP
  4482.             DUMMY=RES640
  4483.             DRWBOX 1, 10, 0, 0, 639, 479
  4484.             DRWLINE 1, 10, 0, 240, 639, 240
  4485.             DRWLINE 1, 10, 320, 0, 320, 479
  4486.             DEG2RAD! = 4 * ATN(1) / 180
  4487.             FOR I = -360 TO 360
  4488.                Y1& = GETCOS(I)
  4489.                Y1& = Y1& * 240 / 8192
  4490.                Y2& = 240 * COS(I * DEG2RAD!)
  4491.                DRWPOINT 1, 15, 320 + I, 240 - Y1&
  4492.                DRWPOINT 1, 12, 320 + I, 240 - Y2&
  4493.             NEXT I
  4494.             WHILE INKEY$ = ""
  4495.             WEND
  4496.             VIDEOMODESET VMODE
  4497.  
  4498.  
  4499.                                                                          71
  4500.  
  4501.  
  4502.  
  4503.  
  4504.  
  4505.             END
  4506.  
  4507.  
  4508.  
  4509.  
  4510.  
  4511.  
  4512.  
  4513.  
  4514.  
  4515.  
  4516.  
  4517.  
  4518.  
  4519.  
  4520.  
  4521.  
  4522.  
  4523.  
  4524.  
  4525.  
  4526.  
  4527.  
  4528.  
  4529.  
  4530.  
  4531.  
  4532.  
  4533.  
  4534.  
  4535.  
  4536.  
  4537.  
  4538.  
  4539.  
  4540.  
  4541.  
  4542.  
  4543.  
  4544.  
  4545.  
  4546.  
  4547.  
  4548.  
  4549.  
  4550.  
  4551.  
  4552.  
  4553.  
  4554.  
  4555.  
  4556.  
  4557.  
  4558.  
  4559.  
  4560.  
  4561.                                                                          72
  4562.  
  4563.  
  4564.  
  4565.  
  4566.  
  4567.           GETLASTSTRING
  4568.  
  4569.             PROTOTYPE
  4570.  
  4571.             SUB GETLASTSTRING (GfxBlk%)
  4572.  
  4573.             INPUT
  4574.  
  4575.             no input parameters
  4576.  
  4577.             OUTPUT
  4578.  
  4579.             no value returned
  4580.             GfxBlk - integer destination array holding bitmap of text
  4581.             block
  4582.  
  4583.             USAGE
  4584.  
  4585.             GETLASTSTRING returns the text drawn on the screen by the last
  4586.             called DRWSTRING function.  The text is returned in GfxBlk
  4587.             which may be used with BLKPUT or the sprite functions.  The
  4588.             text in GfxBlk is oriented in the same manner as the last
  4589.             called DRWSTRING function.  The intended use is to call the
  4590.             DRWSTRING function using mode 0 which does not actually draw
  4591.             text on the screen.  GETLASTSTRING should be called
  4592.             immediately after the DRWSTRING function to prevent possible
  4593.             loss of data caused by other functions.
  4594.  
  4595.             GfxBlk must be dimensioned as a short integer array with a
  4596.             size in integers equal to
  4597.  
  4598.                     [(fontwidth*stringlength)*(fontheight)] / 2+3.
  4599.  
  4600.             The font's dimensions can be obtained by calling FONTGETINFO
  4601.             and the string's length can be obtained using Basic's LEN
  4602.             function.  Note, however, that GfxBlk can be quite large.  If
  4603.             the size of GfxBlk is insufficient, GETLASTSTRING will
  4604.             overwrite any data in memory contained beyond GfxBlk and may
  4605.             possibly cause the system to crash.
  4606.  
  4607.             Arrays should be passed by giving the element within the array
  4608.             from where the action should take place.  This allows the
  4609.             programmer to store more than one item within the same array
  4610.             or act on only a portion of the array.
  4611.  
  4612.             SEE ALSO
  4613.  
  4614.             BLKPUT, DRWSTRING, DRWSTRINGDN, DRWSTRINGLT, DRWSTRINGRT,
  4615.             FONTGETINFO
  4616.  
  4617.             EXAMPLE
  4618.  
  4619.             REM USES GETLASTSTRING TO DRAW SOME TEXT AT THE CENTER OF THE
  4620.             SCREEN
  4621.  
  4622.  
  4623.                                                                          73
  4624.  
  4625.  
  4626.  
  4627.  
  4628.  
  4629.             REM $INCLUDE: 'SVGABC.BI'
  4630.             DEFINT A-Z
  4631.  
  4632.             VMODE=VIDEOMODEGET
  4633.             IF WHICHVGA = 0 THEN STOP
  4634.             DUMMY=RES640
  4635.             A$ = "HELLO WORLD"
  4636.             DRWSTRING 0, 10, 0, A$, 0, 0
  4637.             FONTGETINFO W, H
  4638.             L = LEN(A$)
  4639.             BLKSIZE = ( (W*L)*H )\2 + 3
  4640.             DIM BLK(0 TO BLKSIZE)
  4641.             GETLASTSTRING BLK(0)
  4642.             BLKPUT 1, 320, 240, BLK(0)
  4643.             WHILE INKEY$ = ""
  4644.             WEND
  4645.             VIDEOMODESET VMODE
  4646.             END
  4647.  
  4648.  
  4649.  
  4650.  
  4651.  
  4652.  
  4653.  
  4654.  
  4655.  
  4656.  
  4657.  
  4658.  
  4659.  
  4660.  
  4661.  
  4662.  
  4663.  
  4664.  
  4665.  
  4666.  
  4667.  
  4668.  
  4669.  
  4670.  
  4671.  
  4672.  
  4673.  
  4674.  
  4675.  
  4676.  
  4677.  
  4678.  
  4679.  
  4680.  
  4681.  
  4682.  
  4683.  
  4684.  
  4685.                                                                          74
  4686.  
  4687.  
  4688.  
  4689.  
  4690.  
  4691.           GETMAXX
  4692.  
  4693.             PROTOTYPE
  4694.  
  4695.             FUNCTION GETMAXX% ()
  4696.  
  4697.             INPUT
  4698.  
  4699.             no input parameters
  4700.  
  4701.             OUTPUT
  4702.  
  4703.             GETMAXX returns the current horizontal resolution of the
  4704.             screen.
  4705.  
  4706.             USAGE
  4707.  
  4708.             GETMAXX returns the horizontal resolution of the screen in the
  4709.             current mode.  This function should only be called if one of
  4710.             the RES### functions has been previously called.  Otherwise,
  4711.             the value returned is meaningless.
  4712.  
  4713.             SEE ALSO
  4714.  
  4715.             GETMAXY
  4716.  
  4717.             EXAMPLE
  4718.  
  4719.             REM SHOW GETMAXX
  4720.             REM $INCLUDE: 'SVGABC.BI'
  4721.             DEFINT A-Z
  4722.  
  4723.             VMODE = VIDEOMODEGET
  4724.             IF WHICHVGA = 0 THEN STOP
  4725.             DUMMY=RES640
  4726.             X$ = "MAX X SCREEN VALUE IS:" + STR$(GETMAXX)
  4727.             DRWSTRING 1, 7, 0, X$, 0, 0
  4728.             SETVIEW 0, 0, 400, 479
  4729.             X$ = "MAX X SCREEN VALUE IS STILL:" + STR$(GETMAXX)
  4730.             DRWSTRING 1, 7, 0, X$, 0, 20
  4731.             WHILE INKEY$ = ""
  4732.             WEND
  4733.             VIDEOMODESET VMODE
  4734.             END
  4735.  
  4736.  
  4737.  
  4738.  
  4739.  
  4740.  
  4741.  
  4742.  
  4743.  
  4744.  
  4745.  
  4746.  
  4747.                                                                          75
  4748.  
  4749.  
  4750.  
  4751.  
  4752.  
  4753.           GETMAXY
  4754.  
  4755.             PROTOTYPE
  4756.  
  4757.             FUNCTION GETMAXY% ()
  4758.  
  4759.             INPUT
  4760.  
  4761.             no input parameters
  4762.  
  4763.             OUTPUT
  4764.  
  4765.             GETMAXY returns the current vertical resolution of the screen.
  4766.  
  4767.             USAGE
  4768.  
  4769.             GETMAXY returns the vertical resolution of the screen in the
  4770.             current mode.  This function should only be called if one of
  4771.             the RES### functions has been previously called.  Otherwise,
  4772.             the value returned is meaningless.
  4773.  
  4774.             SEE ALSO
  4775.  
  4776.             GETMAXX
  4777.  
  4778.             EXAMPLE
  4779.  
  4780.             REM SHOW GETMAXY
  4781.             REM $INCLUDE: 'SVGABC.BI'
  4782.             DEFINT A-Z
  4783.  
  4784.             VMODE = VIDEOMODEGET
  4785.             IF WHICHVGA = 0 THEN STOP
  4786.             DUMMY=RES640
  4787.             Y$ = "MAX Y SCREEN VALUE IS:" + STR$(GETMAXY)
  4788.             DRWSTRING 1, 7, 0, Y$, 0, 0
  4789.             SETVIEW 0, 0, 639, 200
  4790.             Y$ = "MAX Y SCREEN VALUE IS STILL:" + STR$(GETMAXY)
  4791.             DRWSTRING 1, 7, 0, Y$, 0, 20
  4792.             WHILE INKEY$ = ""
  4793.             WEND
  4794.             VIDEOMODESET VMODE
  4795.             END
  4796.  
  4797.  
  4798.  
  4799.  
  4800.  
  4801.  
  4802.  
  4803.  
  4804.  
  4805.  
  4806.  
  4807.  
  4808.  
  4809.                                                                          76
  4810.  
  4811.  
  4812.  
  4813.  
  4814.  
  4815.           GETPOINT
  4816.  
  4817.             PROTOTYPE
  4818.  
  4819.             FUNCTION GETPOINT% (X%, Y%)
  4820.  
  4821.             INPUT
  4822.  
  4823.             X, Y - location of pixel to read
  4824.  
  4825.             OUTPUT
  4826.  
  4827.             GETPOINT returns the color index of pixel at X, Y.
  4828.  
  4829.             USAGE
  4830.  
  4831.             GETPOINT returns the value of the pixel at location X, Y.
  4832.             This value is a color index into the current palette.
  4833.  
  4834.             SEE ALSO
  4835.  
  4836.             DRWPOINT
  4837.  
  4838.             EXAMPLE
  4839.  
  4840.             REM DRAW A POINT AND CHECK TO MAKE SURE IT IS THERE
  4841.             REM $INCLUDE: 'SVGABC.BI'
  4842.  
  4843.             DEFINT A-Z
  4844.             IF WHICHVGA = 0 THEN STOP
  4845.             IF WHICHMEM < 512 THEN STOP
  4846.             VMODE = VIDEOMODEGET
  4847.             DUMMY=RES640
  4848.             DRWPOINT 1, 10, 320, 240
  4849.             POINTVALUE = GETPOINT(320, 240)
  4850.             A$ = "THE POINT VALUE IS:" + STR$(POINTVALUE)
  4851.             DRWSTRING 1, 7, 0, A$, 0, 0
  4852.             WHILE INKEY$ = ""
  4853.             WEND
  4854.             VIDEOMODESET VMODE
  4855.             END
  4856.  
  4857.  
  4858.  
  4859.  
  4860.  
  4861.  
  4862.  
  4863.  
  4864.  
  4865.  
  4866.  
  4867.  
  4868.  
  4869.  
  4870.  
  4871.                                                                          77
  4872.  
  4873.  
  4874.  
  4875.  
  4876.  
  4877.           GETSIN
  4878.  
  4879.             PROTOTYPE
  4880.  
  4881.             FUNCTION GETSIN& (Angle&)
  4882.  
  4883.             INPUT
  4884.  
  4885.             Angle - angle in degrees
  4886.  
  4887.             OUTPUT
  4888.  
  4889.             GETSIN returns the sine of Angle scaled up by 13 bits (8192).
  4890.  
  4891.             USAGE
  4892.  
  4893.             GETSIN returns the sine of the specified angle.  Angle can be
  4894.             any long value; floating point values are ignored.  The return
  4895.             value has been multiplied by 8192.  This function uses an
  4896.             integer lookup table stored within the library in order to
  4897.             produce the fastest possible results.  No floating point
  4898.             arithmetic is used.  The scale factor of 13 bits (8192) was
  4899.             chosen because this is the number of bits at which every
  4900.             change of one degree gives a change in the value of the sine
  4901.             (or cosine) function.
  4902.  
  4903.             SEE ALSO
  4904.  
  4905.             GETARCCOS, GETARCSIN, GETARCTAN, GETCOS, GETTAN
  4906.  
  4907.             EXAMPLE
  4908.  
  4909.             REM SHOW GETSIN
  4910.             REM $INCLUDE: 'SVGABC.BI'
  4911.             DEFINT A-Z
  4912.  
  4913.             VMODE = VIDEOMODEGET
  4914.             IF WHICHVGA = 0 THEN STOP
  4915.             DUMMY=RES640
  4916.             DRWBOX 1, 10, 0, 0, 639, 479
  4917.             DRWLINE 1, 10, 0, 240, 639, 240
  4918.             DRWLINE 1, 10, 320, 0, 320, 479
  4919.             DEG2RAD! = 4 * ATN(1) / 180
  4920.             FOR I = -360 TO 360
  4921.                Y1& = GETSIN(I)
  4922.                Y1& = Y1& * 240 / 8192
  4923.                Y2& = 240 * SIN(I * DEG2RAD!)
  4924.                DRWPOINT 1, 15, 320 + I, 240 - Y1&
  4925.                DRWPOINT 1, 12, 320 + I, 240 - Y2&
  4926.             NEXT I
  4927.             WHILE INKEY$ = ""
  4928.             WEND
  4929.             VIDEOMODESET VMODE
  4930.             END
  4931.  
  4932.  
  4933.                                                                          78
  4934.  
  4935.  
  4936.  
  4937.  
  4938.  
  4939.           GETTAN
  4940.  
  4941.             PROTOTYPE
  4942.  
  4943.             FUNCTION GETTAN& (Angle%)
  4944.  
  4945.             INPUT
  4946.  
  4947.             Angle - angle in degrees
  4948.  
  4949.             OUTPUT
  4950.  
  4951.             GETTAN returns the tangent of Angle scaled up by 13 bits
  4952.             (8192).
  4953.  
  4954.             USAGE
  4955.  
  4956.             GETTAN returns the tangent of the specified angle.  Angle can
  4957.             be any long value except +(90+n*180), where n is an integer.
  4958.             Floating point values are ignored.  The return value has been
  4959.             multiplied by 8192.  If an invalid angle is given, the GETTAN
  4960.             will return &H80000000 (-2147483648).  This function uses an
  4961.             integer lookup table stored within the library in order to
  4962.             produce the fastest possible results.  No floating point
  4963.             arithmetic is used.  The scale factor of 13 bits (8192) was
  4964.             chosen because this is the number of bits at which every
  4965.             change of one degree gives a change in the value of the sine
  4966.             (or cosine) function.
  4967.  
  4968.             SEE ALSO
  4969.  
  4970.             GETARCCOS, GETARCSIN, GETARCTAN, GETCOS, GETSIN
  4971.  
  4972.             EXAMPLE
  4973.  
  4974.             REM SHOW GETTAN
  4975.             REM $INCLUDE: 'SVGABC.BI'
  4976.             DEFINT A-Z
  4977.  
  4978.             VMODE = VIDEOMODEGET
  4979.             IF WHICHVGA = 0 THEN STOP
  4980.             DUMMY=RES640
  4981.             DRWBOX 1, 10, 0, 0, 639, 479
  4982.             DRWLINE 1, 10, 0, 240, 639, 240
  4983.             DRWLINE 1, 10, 320, 0, 320, 479
  4984.             DEG2RAD! = 4 * ATN(1) / 180
  4985.             FOR I = -360 TO 360
  4986.                IF ((I - 90) / 180) <> INT((I - 90) / 180) THEN
  4987.                  Y1& = GETTAN(I)
  4988.                  Y1& = Y1& * 240 / 8192
  4989.                  Y2& = 240 * TAN(I * DEG2RAD!)
  4990.                  DRWPOINT 1, 15, 320 + I, 240 - Y1&
  4991.                  DRWPOINT 1, 12, 320 + I, 240 - Y2&
  4992.                END IF
  4993.  
  4994.  
  4995.                                                                          79
  4996.  
  4997.  
  4998.  
  4999.  
  5000.  
  5001.             NEXT I
  5002.             WHILE INKEY$ = ""
  5003.             WEND
  5004.             VIDEOMODESET VMODE
  5005.             END
  5006.  
  5007.  
  5008.  
  5009.  
  5010.  
  5011.  
  5012.  
  5013.  
  5014.  
  5015.  
  5016.  
  5017.  
  5018.  
  5019.  
  5020.  
  5021.  
  5022.  
  5023.  
  5024.  
  5025.  
  5026.  
  5027.  
  5028.  
  5029.  
  5030.  
  5031.  
  5032.  
  5033.  
  5034.  
  5035.  
  5036.  
  5037.  
  5038.  
  5039.  
  5040.  
  5041.  
  5042.  
  5043.  
  5044.  
  5045.  
  5046.  
  5047.  
  5048.  
  5049.  
  5050.  
  5051.  
  5052.  
  5053.  
  5054.  
  5055.  
  5056.  
  5057.                                                                          80
  5058.  
  5059.  
  5060.  
  5061.  
  5062.  
  5063.            JOYSTICKINFO
  5064.  
  5065.             PROTOTYPE
  5066.  
  5067.             SUB JOYSTICKINFO (JAX%, JAY%, JAButs%, JBX%, JBY%, JBButs%)
  5068.  
  5069.             INPUT
  5070.  
  5071.             no input parameters
  5072.  
  5073.             OUTPUT
  5074.  
  5075.             no value returned
  5076.             JAX, JAY - horizontal and vertical values of joystick A
  5077.             JAButs - button status of joystick A
  5078.             JBX, JBY - horizontal and vertical values of joystick B
  5079.             JBButs - button status of joystick B
  5080.  
  5081.             USAGE
  5082.  
  5083.             JOYSTICKINFO returns the current status of the two joysticks'
  5084.             position and buttons.  The position is returned in JAX, JAY
  5085.             for joystick A and JBX, JBY for joystick B.  The buttons'
  5086.             status is held in JAButs and JBButs.  For each joystick,
  5087.             button A - usually the fire button - is held in bit zero and
  5088.             button B is in bit one.  Button status is most easily checked
  5089.             with a bitwise AND of JAButs (or JBButs) and the desired bit.
  5090.  
  5091.             Not all joysticks are constructed the same.  In addition,
  5092.             joysticks are not linear devices.  The value of its center
  5093.             will not necessarily be the mean of its extreme values.
  5094.             Therefore, it is recommended that any program using the
  5095.             joystick for more than just directional control complete a
  5096.             calibration of the joystick prior to usage.  For an example of
  5097.             joystick calibration, see the SVGADEMO.EXE source code.
  5098.  
  5099.             SEE ALSO
  5100.  
  5101.             WHICHJOYSTICK
  5102.  
  5103.             EXAMPLE
  5104.  
  5105.             REM DISPLAY THE STATUS OF THE JOYSTICK PORT
  5106.             REM $INCLUDE: 'SVGABC.BI'
  5107.             DEFINT A-Z
  5108.  
  5109.             CLS
  5110.             WHILE INKEY$ = ""
  5111.                JOYSTICKINFO JAX, JAY, JAButs, JBX, JBY, JBButs
  5112.                LOCATE 1, 1
  5113.                PRINT STRING$(40, 32)
  5114.                LOCATE 1, 1
  5115.                PRINT JAX; JAY; JAButs, JBX; JBY; JBButs;
  5116.                SDELAY 4
  5117.  
  5118.  
  5119.                                                                          81
  5120.  
  5121.  
  5122.  
  5123.  
  5124.  
  5125.             WEND
  5126.             END
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.  
  5144.  
  5145.  
  5146.  
  5147.  
  5148.  
  5149.  
  5150.  
  5151.  
  5152.  
  5153.  
  5154.  
  5155.  
  5156.  
  5157.  
  5158.  
  5159.  
  5160.  
  5161.  
  5162.  
  5163.  
  5164.  
  5165.  
  5166.  
  5167.  
  5168.  
  5169.  
  5170.  
  5171.  
  5172.  
  5173.  
  5174.  
  5175.  
  5176.  
  5177.  
  5178.  
  5179.  
  5180.  
  5181.                                                                          82
  5182.  
  5183.  
  5184.  
  5185.  
  5186.  
  5187.           MOUSEBUTPRESS
  5188.  
  5189.             PROTOTYPE
  5190.  
  5191.             SUB MOUSEBUTPRESS (ReqButton%, X%, Y%, Num%, MouseButs%)
  5192.  
  5193.             INPUT
  5194.  
  5195.             ReqButton - button for which information is requested
  5196.  
  5197.             OUTPUT
  5198.  
  5199.             no value returned
  5200.             X, Y - current location of mouse cursor
  5201.             Num - number of times button has been pressed since last
  5202.             request
  5203.             MouseButs - current status of the mouse buttons
  5204.  
  5205.             USAGE
  5206.  
  5207.             MOUSEBUTPRESS returns in Num the number of times a mouse
  5208.             button has been pressed since the last call to MOUSEBUTPRESS.
  5209.             In addition the current status of the mouse cursor and buttons
  5210.             is returned.  The position is returned in X, Y.  The buttons'
  5211.             status is held in MouseButs.  The left button is held in bit
  5212.             zero, right button in bit one and center button - for three
  5213.             button mice - in bit two.  Button status is most easily
  5214.             checked with a bitwise AND of MouseButs and the desired bit.
  5215.             The button for which a history is desired is identified by the
  5216.             bits in ReqButton.  However, only one bit may be set.
  5217.             Therefore, only the values of 1, 2 and 4 are permitted.  If
  5218.             more than one bit in ReqButton is set, the function will exit
  5219.             and no information will be returned.
  5220.  
  5221.             SEE ALSO
  5222.  
  5223.             MOUSEBUTRELEASE, MOUSESTATUS
  5224.  
  5225.             EXAMPLE
  5226.  
  5227.             REM ENABLE, SHOW, MOUSE / DISPLAY LEFT BUTTON PRESS HISTORY
  5228.             REM FOR THE LAST 2 SECONDS
  5229.             REM $INCLUDE: 'SVGABC.BI'
  5230.             DEFINT A-Z
  5231.  
  5232.             VMODE = VIDEOMODEGET
  5233.             IF WHICHVGA = 0 THEN STOP
  5234.             IF WHICHMOUSE = 0 THEN STOP
  5235.             DUMMY=RES640
  5236.             MOUSEENTER
  5237.             MOUSESHOW
  5238.             WHILE INKEY$ = ""
  5239.                MOUSEBUTPRESS 1, X, Y, N, MBUTS
  5240.                D$ = "MX=" + STR$(X)
  5241.  
  5242.  
  5243.                                                                          83
  5244.  
  5245.  
  5246.  
  5247.  
  5248.  
  5249.                L = LEN(D$)
  5250.                IF L < 10 THEN
  5251.                  D$ = D$ + STRING$(8 - L, 32)
  5252.                END IF
  5253.                D$ = D$ + "MY=" + STR$(Y)
  5254.                L = LEN(D$)
  5255.                IF L < 20 THEN
  5256.                  D$ = D$ + STRING$(16 - L, 32)
  5257.                END IF
  5258.                D$ = D$ + "Number Of Times=" + STR$(N)
  5259.                DRWSTRING 1, 15, 8, D$, 0, 0
  5260.                SDELAY 80
  5261.             WEND
  5262.             MOUSEEXIT
  5263.             VIDEOMODESET VMODE
  5264.             END
  5265.  
  5266.  
  5267.  
  5268.  
  5269.  
  5270.  
  5271.  
  5272.  
  5273.  
  5274.  
  5275.  
  5276.  
  5277.  
  5278.  
  5279.  
  5280.  
  5281.  
  5282.  
  5283.  
  5284.  
  5285.  
  5286.  
  5287.  
  5288.  
  5289.  
  5290.  
  5291.  
  5292.  
  5293.  
  5294.  
  5295.  
  5296.  
  5297.  
  5298.  
  5299.  
  5300.  
  5301.  
  5302.  
  5303.  
  5304.  
  5305.                                                                          84
  5306.  
  5307.  
  5308.  
  5309.  
  5310.  
  5311.           MOUSEBUTRELEASE
  5312.  
  5313.             PROTOTYPE
  5314.  
  5315.             SUB MOUSEBUTRELEASE (ReqButton%, X%, Y%, Num%, MouseButs%)
  5316.  
  5317.             INPUT
  5318.  
  5319.             ReqButton - button for which information is requested
  5320.  
  5321.             OUTPUT
  5322.  
  5323.             no value returned
  5324.             X, Y - current location of mouse cursor
  5325.             Num - number of times button has been released since last
  5326.             request
  5327.             MouseButs - current status of mouse buttons
  5328.  
  5329.             USAGE
  5330.  
  5331.             MOUSEBUTRELEASE returns in Num the number of times a mouse
  5332.             button has been released since the last call to
  5333.             MOUSEBUTRELEASE.  In addition the current status of the mouse
  5334.             cursor and buttons is returned.  The position is returned in
  5335.             X, Y.  The buttons' status is held in MouseButs.  The left
  5336.             button is held in bit zero, right button in bit one and center
  5337.             button - for three button mice - in bit two.  Button status is
  5338.             most easily checked with a bitwise AND of MouseButs and the
  5339.             desired bit.  The button for which a history is desired is
  5340.             identified by the bits in ReqButton.  However, only one bit
  5341.             may be set.  Therefore, only the values of 1, 2 and 4 are
  5342.             permitted.  If more than one bit in ReqButton is set, the
  5343.             function will exit and no information will be returned.
  5344.  
  5345.             SEE ALSO
  5346.  
  5347.             MOUSEBUTPRESS, MOUSESTATUS
  5348.  
  5349.             EXAMPLE
  5350.  
  5351.             REM ENABLE, SHOW, MOUSE / DISPLAY LEFT BUTTON RELEASE HISTORY
  5352.             REM FOR THE LAST 2 SECONDS
  5353.             REM $INCLUDE: 'SVGABC.BI'
  5354.             DEFINT A-Z
  5355.  
  5356.             VMODE = VIDEOMODEGET
  5357.             IF WHICHVGA = 0 THEN STOP
  5358.             IF WHICHMOUSE = 0 THEN STOP
  5359.             DUMMY=RES640
  5360.             MOUSEENTER
  5361.             MOUSESHOW
  5362.             WHILE INKEY$ = ""
  5363.                MOUSEBUTRELEASE 1, X, Y, N, MBUTS
  5364.                D$ = "MX=" + STR$(X)
  5365.  
  5366.  
  5367.                                                                          85
  5368.  
  5369.  
  5370.  
  5371.  
  5372.  
  5373.                L = LEN(D$)
  5374.                IF L < 10 THEN
  5375.                D$ = D$ + STRING$(8 - L, 32)
  5376.                END IF
  5377.                D$ = D$ + "MY=" + STR$(Y)
  5378.                L = LEN(D$)
  5379.                IF L < 20 THEN
  5380.                  D$ = D$ + STRING$(16 - L, 32)
  5381.                END IF
  5382.                D$ = D$ + "Number Of Times=" + STR$(N)
  5383.                DRWSTRING 1, 15, 8, D$, 0, 0
  5384.                SDELAY 80
  5385.             WEND
  5386.             MOUSEEXIT
  5387.             VIDEOMODESET VMODE
  5388.             END
  5389.  
  5390.  
  5391.  
  5392.  
  5393.  
  5394.  
  5395.  
  5396.  
  5397.  
  5398.  
  5399.  
  5400.  
  5401.  
  5402.  
  5403.  
  5404.  
  5405.  
  5406.  
  5407.  
  5408.  
  5409.  
  5410.  
  5411.  
  5412.  
  5413.  
  5414.  
  5415.  
  5416.  
  5417.  
  5418.  
  5419.  
  5420.  
  5421.  
  5422.  
  5423.  
  5424.  
  5425.  
  5426.  
  5427.  
  5428.  
  5429.                                                                          86
  5430.  
  5431.  
  5432.  
  5433.  
  5434.  
  5435.           MOUSECURSORDEFAULT
  5436.  
  5437.             PROTOTYPE
  5438.  
  5439.             SUB MOUSECURSORDEFAULT ()
  5440.  
  5441.             INPUT
  5442.  
  5443.             no input parameters
  5444.  
  5445.             OUTPUT
  5446.  
  5447.             no value returned
  5448.  
  5449.             USAGE
  5450.  
  5451.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  5452.             arrow with the hot spot in the upper, left corner.  This is
  5453.             the cursor set when MOUSEENTER is called.
  5454.  
  5455.             SEE ALSO
  5456.  
  5457.             MOUSECURSORSET, MOUSEENTER
  5458.  
  5459.             EXAMPLE
  5460.  
  5461.             See MOUSECURSORSET
  5462.  
  5463.  
  5464.  
  5465.  
  5466.  
  5467.  
  5468.  
  5469.  
  5470.  
  5471.  
  5472.  
  5473.  
  5474.  
  5475.  
  5476.  
  5477.  
  5478.  
  5479.  
  5480.  
  5481.  
  5482.  
  5483.  
  5484.  
  5485.  
  5486.  
  5487.  
  5488.  
  5489.  
  5490.  
  5491.                                                                          87
  5492.  
  5493.  
  5494.  
  5495.  
  5496.  
  5497.           MOUSECURSORSET
  5498.  
  5499.             PROTOTYPE
  5500.  
  5501.             SUB MOUSECURSORSET (MouseCursor$)
  5502.  
  5503.             INPUT
  5504.  
  5505.             MouseCursor$ - string * 386 containing mouse cursor data
  5506.  
  5507.             OUTPUT
  5508.  
  5509.             no value returned
  5510.  
  5511.             USAGE
  5512.  
  5513.             MOUSECURSORSET defines the cursor according to the data in
  5514.             MouseCursor$.  The hot spot X and Y location for the cursor is
  5515.             defined by the first two bytes of MouseCursor$.  The values
  5516.             for the hot spot must be within the cursor.  Valid values are
  5517.             from 0 to 15 for the X location and from 0 to 23 for the Y
  5518.             location.
  5519.  
  5520.             SEE ALSO
  5521.  
  5522.             MOUSECURSORDEFAULT, MOUSEENTER, MOUSESHOW
  5523.  
  5524.             EXAMPLE
  5525.  
  5526.             REM MAKE A BIG CURSOR, THEN RESTORE IT BACK TO THE DEFAULT
  5527.             REM $INCLUDE: 'SVGABC.BI'
  5528.             DEFINT A-Z
  5529.  
  5530.             VMODE = VIDEOMODEGET
  5531.             IF WHICHVGA = 0 THEN STOP
  5532.             IF WHICHMEM < 512 THEN STOP
  5533.             IF WHICHMOUSE = 0 THEN STOP
  5534.             DUMMY=RES640
  5535.             MOUSEENTER
  5536.             DIM BIGMOUSECURSOR AS STRING * 386
  5537.             FOR I = 1 TO 386
  5538.                READ A
  5539.                MID$(BIGMOUSECURSOR, I, 1) = CHR$(A)
  5540.             NEXT I
  5541.             MOUSECURSORSET BIGMOUSECURSOR
  5542.             MOUSERANGESET 0, 0, 639, 400
  5543.             MOUSESHOW
  5544.             A$ = "Press A Key To Return To The Default Cursor"
  5545.             DRWSTRING 1, 7, 0, A$, 0, 420
  5546.             WHILE INKEY$ = ""
  5547.             WEND
  5548.             MOUSECURSORDEFAULT
  5549.             A$ = "Press A Key To End                         "
  5550.             DRWSTRING 1, 7, 0, A$, 0, 420
  5551.  
  5552.  
  5553.                                                                          88
  5554.  
  5555.  
  5556.  
  5557.  
  5558.  
  5559.             WHILE INKEY$ = ""
  5560.             WEND
  5561.             MOUSEEXIT
  5562.             VIDEOMODESET VMODE
  5563.             END
  5564.  
  5565.             REM *BIG ARROW MOUSE CURSOR DATA
  5566.             DATA 2,2
  5567.             DATA 0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255
  5568.             DATA 0,15,15,0,0,255,255,255,255,255,255,255,255,255,255,255
  5569.             DATA 0,15,15,15,15,0,0,0,255,255,255,255,255,255,255,255
  5570.             DATA 0,15,15,15,15,15,15,15,0,0,255,255,255,255,255,255
  5571.             DATA 0,15,15,15,15,15,15,15,15,15,0,0,0,255,255,255
  5572.             DATA 0,15,15,15,15,15,15,15,15,15,15,15,15,0,0,255
  5573.             DATA 0,15,15,15,15,15,15,15,15,15,15,15,15,15,0,255
  5574.             DATA 0,15,15,15,15,15,15,15,15,15,15,15,0,0,255,255
  5575.             DATA 0,15,15,15,15,15,15,15,15,15,15,0,255,255,255,255
  5576.             DATA 0,15,15,15,15,15,15,15,15,0,0,255,255,255,255,255
  5577.             DATA 0,15,15,15,15,15,15,15,15,0,255,255,255,255,255,255
  5578.             DATA 0,15,15,15,15,15,0,15,15,15,0,255,255,255,255,255
  5579.             DATA 0,15,15,15,15,0,0,15,15,15,0,255,255,255,255,255
  5580.             DATA 0,15,15,0,0,255,255,0,15,15,15,0,255,255,255,255
  5581.             DATA 0,15,0,255,255,255,255,0,15,15,15,0,255,255,255,255
  5582.             DATA 0,0,255,255,255,255,255,255,0,15,15,15,0,255,255,255
  5583.             DATA 255,255,255,255,255,255,255,255,255,0,15,15,15,0,255,255
  5584.             DATA 255,255,255,255,255,255,255,255,255,0,15,15,15,0,255,255
  5585.             DATA 255,255,255,255,255,255,255,255,255,255,0,15,15,15,0,255
  5586.             DATA 255,255,255,255,255,255,255,255,255,255,255,0,15,15,15,0
  5587.             DATA 255,255,255,255,255,255,255,255,255,255,255,0,15,15,15,0
  5588.             DATA 255,255,255,255,255,255,255,255,255,255,255,255,0,15,15,0
  5589.             DATA 255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0
  5590.             DATA
  5591.             255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,25
  5592.             5
  5593.  
  5594.  
  5595.  
  5596.  
  5597.  
  5598.  
  5599.  
  5600.  
  5601.  
  5602.  
  5603.  
  5604.  
  5605.  
  5606.  
  5607.  
  5608.  
  5609.  
  5610.  
  5611.  
  5612.  
  5613.  
  5614.  
  5615.                                                                          89
  5616.  
  5617.  
  5618.  
  5619.  
  5620.  
  5621.           MOUSEENTER
  5622.  
  5623.             PROTOTYPE
  5624.  
  5625.             SUB MOUSEENTER ()
  5626.  
  5627.             INPUT
  5628.  
  5629.             no input parameters
  5630.  
  5631.             OUTPUT
  5632.  
  5633.             no value returned
  5634.  
  5635.             USAGE
  5636.  
  5637.             MOUSEENTER must be called before any other mouse functions.
  5638.             It initializes all of the mouse abilities including installing
  5639.             the Zephyr mouse display driver.  MOUSEENTER initializes the
  5640.             default mouse cursor, the default sensitivity and sets the
  5641.             range to the current screen resolution.  The mouse cursor
  5642.             location is set to the middle of the screen.
  5643.  
  5644.             SEE ALSO
  5645.  
  5646.             MOUSEEXIT, MOUSEHIDE, MOUSESHOW
  5647.  
  5648.             EXAMPLE
  5649.  
  5650.             REM ENABLE AND SHOW THE MOUSE
  5651.             REM $INCLUDE: 'SVGABC.BI'
  5652.             DEFINT A-Z
  5653.  
  5654.             VMODE = VIDEOMODEGET
  5655.             IF WHICHVGA = 0 THEN STOP
  5656.             IF WHICHMOUSE = 0 THEN STOP
  5657.             DUMMY=RES640
  5658.             MOUSEENTER
  5659.             MOUSESHOW
  5660.             WHILE INKEY$ = ""
  5661.             WEND
  5662.             MOUSEEXIT
  5663.             VIDEOMODESET VMODE
  5664.             END
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.  
  5674.  
  5675.  
  5676.  
  5677.                                                                          90
  5678.  
  5679.  
  5680.  
  5681.  
  5682.  
  5683.           MOUSEEXIT
  5684.  
  5685.             PROTOTYPE
  5686.  
  5687.             SUB MOUSEEXIT ()
  5688.  
  5689.             INPUT
  5690.  
  5691.             no input parameters
  5692.  
  5693.             OUTPUT
  5694.  
  5695.             no value returned
  5696.  
  5697.             USAGE
  5698.  
  5699.             MOUSEEXIT properly disables all of the mouse abilities.  This
  5700.             function also removes the Zephyr mouse display driver.  This
  5701.             function should be called prior to exiting any program that
  5702.             previously called MOUSEENTER.
  5703.  
  5704.             SEE ALSO
  5705.  
  5706.             MOUSEENTER, MOUSEHIDE, MOUSESHOW
  5707.  
  5708.             EXAMPLE
  5709.  
  5710.             See MOUSEENTER
  5711.  
  5712.  
  5713.  
  5714.  
  5715.  
  5716.  
  5717.  
  5718.  
  5719.  
  5720.  
  5721.  
  5722.  
  5723.  
  5724.  
  5725.  
  5726.  
  5727.  
  5728.  
  5729.  
  5730.  
  5731.  
  5732.  
  5733.  
  5734.  
  5735.  
  5736.  
  5737.  
  5738.  
  5739.                                                                          91
  5740.  
  5741.  
  5742.  
  5743.  
  5744.  
  5745.           MOUSEHIDE
  5746.  
  5747.             PROTOTYPE
  5748.  
  5749.             SUB MOUSEHIDE ()
  5750.  
  5751.             INPUT
  5752.  
  5753.             no input parameters
  5754.  
  5755.             OUTPUT
  5756.  
  5757.             no value returned
  5758.  
  5759.             USAGE
  5760.  
  5761.             MOUSEHIDE turns off the mouse display driver and removes the
  5762.             cursor from the display.  It is recommended to hide the mouse
  5763.             any time something will be drawn in its general vicinity.
  5764.             Note, however, that although the cursor is not visible, all
  5765.             other mouse abilities remain active.
  5766.  
  5767.             SEE ALSO
  5768.  
  5769.             MOUSEENTER, MOUSEEXIT, MOUSESHOW
  5770.  
  5771.             EXAMPLE
  5772.  
  5773.             REM ENABLE, SHOW, AND THE HIDE THE MOUSE
  5774.             REM $INCLUDE: 'SVGABC.BI'
  5775.             DEFINT A-Z
  5776.  
  5777.             VMODE = VIDEOMODEGET
  5778.             IF WHICHVGA = 0 THEN STOP
  5779.             IF WHICHMOUSE = 0 THEN STOP
  5780.             DUMMY=RES640
  5781.  
  5782.             MOUSEENTER
  5783.             MOUSESHOW
  5784.             WHILE INKEY$ = ""
  5785.             WEND
  5786.             MOUSEHIDE
  5787.  
  5788.             WHILE INKEY$ = ""
  5789.             WEND
  5790.             MOUSEEXIT
  5791.             VIDEOMODESET VMODE
  5792.  
  5793.             END
  5794.  
  5795.  
  5796.  
  5797.  
  5798.  
  5799.  
  5800.  
  5801.                                                                          92
  5802.  
  5803.  
  5804.  
  5805.  
  5806.  
  5807.           MOUSEINFO
  5808.  
  5809.             PROTOTYPE
  5810.  
  5811.             SUB MOUSEINFO (MajorVersion%, MinorVersion%, MouseType%, IRQ%)
  5812.  
  5813.             INPUT
  5814.  
  5815.             no input parameters
  5816.  
  5817.             OUTPUT
  5818.  
  5819.             no value returned
  5820.             MajorVersion - Microsoft compatible mouse driver major version
  5821.             number
  5822.             MinorVersion - Microsoft compatible mouse driver minor version
  5823.             number
  5824.             MouseType - type of mouse installed
  5825.             IRQ - the interrupt used by the mouse
  5826.  
  5827.             USAGE
  5828.  
  5829.             MOUSEINFO returns information about the mouse and its
  5830.             installed driver.  The driver must be Microsoft compatible.
  5831.             This information can be used to determine whether the mouse
  5832.             functions in this library will operate correctly.  For proper
  5833.             operation the driver version number must be greater than 1.00.
  5834.             IRQ gives the interrupt number of the mouse - probably 3 or 4.
  5835.             MouseType returns information about the type of hardware
  5836.             installed according to the following table:
  5837.  
  5838.             0 =  unknown type
  5839.             1 =  bus mouse
  5840.             2 =  serial mouse
  5841.             3 =  Inport mouse
  5842.             4 =  PS/2 mouse
  5843.             5 =  HP mouse
  5844.  
  5845.             SEE ALSO
  5846.  
  5847.             WHICHMOUSE
  5848.  
  5849.             EXAMPLE
  5850.  
  5851.             REM RETURN INFORMATION ABOUT THE MOUSE
  5852.             REM $INCLUDE: 'SVGABC.BI'
  5853.             DEFINT A-Z
  5854.  
  5855.             CLS
  5856.             MOUSE = WHICHMOUSE
  5857.             IF MOUSE > 0 THEN
  5858.                MOUSEINFO MJV, MNV, TP, I
  5859.                VER$ = STR$(MNV)
  5860.                L = LEN(VER$)
  5861.  
  5862.  
  5863.                                                                          93
  5864.  
  5865.  
  5866.  
  5867.  
  5868.  
  5869.                VER$ = STR$(MJV) + "." + RIGHT$(VER$, L - 1)
  5870.                VER$ = "Software driver version is" + VER$
  5871.                VER$ = VER$ + " (Microsoft equivalent version)."
  5872.                SELECT CASE TP
  5873.                  CASE IS = 1
  5874.                     TYPE$ = "bus mouse"
  5875.                  CASE IS = 2
  5876.                     TYPE$ = "serial mouse"
  5877.                  CASE IS = 3
  5878.                     TYPE$ = "Inport mouse"
  5879.                  CASE IS = 4
  5880.                     TYPE$ = "PS/2 mouse"
  5881.                  CASE IS = 5
  5882.                     TYPE$ = "HP mouse"
  5883.                  CASE ELSE
  5884.                     TYPE$ = "unknown type"
  5885.                END SELECT
  5886.                PRINT "Microsoft compatible " + TYPE$ + " detected with";
  5887.                PRINT STR$(MOUSE) + " buttons on IRQ" + STR$(I) + "."
  5888.                PRINT VER$
  5889.             ELSE
  5890.                PRINT "No Microsoft compatible mouse detected."
  5891.             END IF
  5892.             PRINT
  5893.             WHILE INKEY$ = ""
  5894.             WEND
  5895.             END
  5896.  
  5897.  
  5898.  
  5899.  
  5900.  
  5901.  
  5902.  
  5903.  
  5904.  
  5905.  
  5906.  
  5907.  
  5908.  
  5909.  
  5910.  
  5911.  
  5912.  
  5913.  
  5914.  
  5915.  
  5916.  
  5917.  
  5918.  
  5919.  
  5920.  
  5921.  
  5922.  
  5923.  
  5924.  
  5925.                                                                          94
  5926.  
  5927.  
  5928.  
  5929.  
  5930.  
  5931.           MOUSELOCSET
  5932.  
  5933.             PROTOTYPE
  5934.  
  5935.             SUB MOUSELOCSET (X%, Y%)
  5936.  
  5937.             INPUT
  5938.  
  5939.             X, Y - location on screen
  5940.  
  5941.             OUTPUT
  5942.  
  5943.             no value returned
  5944.  
  5945.             USAGE
  5946.  
  5947.             MOUSELOCSET moves the mouse cursor the location on the screen
  5948.             specified by X, Y.  If either X or Y is outside of the
  5949.             currently permitted mouse range, it is set to the closest
  5950.             border.  The currently permitted mouse range is the current
  5951.             screen resolution or the last called MOUSERANGESET.
  5952.  
  5953.             SEE ALSO
  5954.  
  5955.             MOUSEENTER, MOUSERANGESET
  5956.  
  5957.             EXAMPLE
  5958.  
  5959.             REM ENABLE AND SHOW THE MOUSE THEN MOVE IT TO THE ORIGIN
  5960.             REM $INCLUDE: 'SVGABC.BI'
  5961.             DEFINT A-Z
  5962.  
  5963.             VMODE = VIDEOMODEGET
  5964.             IF WHICHVGA = 0 THEN STOP
  5965.             IF WHICHMOUSE = 0 THEN STOP
  5966.             DUMMY=RES640
  5967.             MOUSEENTER
  5968.             MOUSESHOW
  5969.             WHILE INKEY$ = ""
  5970.             WEND
  5971.             MOUSELOCSET 0, 0
  5972.             WHILE INKEY$ = ""
  5973.             WEND
  5974.             MOUSEEXIT
  5975.             VIDEOMODESET VMODE
  5976.             END
  5977.  
  5978.  
  5979.  
  5980.  
  5981.  
  5982.  
  5983.  
  5984.  
  5985.  
  5986.  
  5987.                                                                          95
  5988.  
  5989.  
  5990.  
  5991.  
  5992.  
  5993.           MOUSERANGESET
  5994.  
  5995.             PROTOTYPE
  5996.  
  5997.             SUB MOUSERANGESET (X1%, Y1%, X2%, Y2%)
  5998.  
  5999.             INPUT
  6000.  
  6001.             X1, Y1 - location on screen of top, left corner of range
  6002.             X2, Y2 - location on screen of bottom, right corner of range
  6003.  
  6004.             OUTPUT
  6005.  
  6006.             no value returned
  6007.  
  6008.             USAGE
  6009.  
  6010.             MOUSERANGESET defines a permissible range on the screen for
  6011.             mouse movement.  The mouse is automatically positioned in the
  6012.             center of this range.
  6013.  
  6014.             SEE ALSO
  6015.  
  6016.             MOUSELOCSET, MOUSESTATUS
  6017.  
  6018.             EXAMPLE
  6019.  
  6020.             REM ENABLE, SHOW, AND SET A RANGE FOR THE MOUSE
  6021.             REM $INCLUDE: 'SVGABC.BI'
  6022.             DEFINT A-Z
  6023.  
  6024.             VMODE = VIDEOMODEGET
  6025.             IF WHICHVGA = 0 THEN STOP
  6026.             IF WHICHMOUSE = 0 THEN STOP
  6027.             DUMMY=RES640
  6028.             MOUSEENTER
  6029.             DRWBOX 1, 10, 100, 100, 539, 379
  6030.             MOUSERANGESET 100, 100, 539, 379
  6031.             MOUSESHOW
  6032.             WHILE INKEY$ = ""
  6033.             WEND
  6034.             MOUSEEXIT
  6035.             VIDEOMODESET VMODE
  6036.             END
  6037.  
  6038.  
  6039.  
  6040.  
  6041.  
  6042.  
  6043.  
  6044.  
  6045.  
  6046.  
  6047.  
  6048.  
  6049.                                                                          96
  6050.  
  6051.  
  6052.  
  6053.  
  6054.  
  6055.           MOUSERESTORESTATE
  6056.  
  6057.             PROTOTYPE
  6058.  
  6059.             SUB MOUSERESTORESTATE (MouseBuf%)
  6060.  
  6061.             INPUT
  6062.  
  6063.             MouseBuf - integer array holding complete mouse status
  6064.             information
  6065.  
  6066.             OUTPUT
  6067.  
  6068.             no value returned
  6069.  
  6070.             USAGE
  6071.  
  6072.             MOUSERESTORESTATE completely restores a previously saved mouse
  6073.             status as contained in MouseBuf.  The mouse status must have
  6074.             been already stored in MouseBuf by MOUSESAVESTATE.
  6075.  
  6076.             SEE ALSO
  6077.  
  6078.             MOUSESAVESTATE, MOUSESTORAGESIZE
  6079.  
  6080.             EXAMPLE
  6081.  
  6082.             REM SAVE THE CURRENT MOUSE DRIVER STATUS,SHELL OUT, RESTORE IT
  6083.             REM $INCLUDE: 'SVGABC.BI'
  6084.             DEFINT A-Z
  6085.  
  6086.             IF WHICHMOUSE = 0 THEN STOP
  6087.             BUFSIZE = MOUSESTORAGESIZE \ 2 + 1
  6088.             DIM MBUFFER(0 TO BUFSIZE) AS INTEGER
  6089.             MOUSESAVESTATE MBUFFER(0)
  6090.             PRINT "TYPE 'EXIT' TO RETURN TO THE PROGRAM"
  6091.             SHELL
  6092.             CLS
  6093.             MOUSERESTORESTATE MBUFFER(0)
  6094.             PRINT "DRIVER RESTORED..."
  6095.             WHILE INKEY$ = ""
  6096.             WEND
  6097.             END
  6098.  
  6099.  
  6100.  
  6101.  
  6102.  
  6103.  
  6104.  
  6105.  
  6106.  
  6107.  
  6108.  
  6109.  
  6110.  
  6111.                                                                          97
  6112.  
  6113.  
  6114.  
  6115.  
  6116.  
  6117.           MOUSESAVESTATE
  6118.  
  6119.             PROTOTYPE
  6120.  
  6121.             SUB MOUSESAVESTATE (MouseBuf%)
  6122.  
  6123.             INPUT
  6124.  
  6125.             no input parameters
  6126.  
  6127.             OUTPUT
  6128.  
  6129.             no value returned
  6130.             MouseBuf - integer array holding complete mouse status
  6131.             information
  6132.  
  6133.             USAGE
  6134.  
  6135.             MOUSESAVESTATE saves the complete mouse status in MouseBuf.
  6136.             The size of MouseBuf in bytes is defined by MOUSESTORAGESIZE
  6137.             which should called first.
  6138.  
  6139.             SEE ALSO
  6140.  
  6141.             MOUSERESTORESTATE, MOUSESTORAGESIZE
  6142.  
  6143.             EXAMPLE
  6144.  
  6145.             See MOUSERESTORESTATE
  6146.  
  6147.  
  6148.  
  6149.  
  6150.  
  6151.  
  6152.  
  6153.  
  6154.  
  6155.  
  6156.  
  6157.  
  6158.  
  6159.  
  6160.  
  6161.  
  6162.  
  6163.  
  6164.  
  6165.  
  6166.  
  6167.  
  6168.  
  6169.  
  6170.  
  6171.  
  6172.  
  6173.                                                                          98
  6174.  
  6175.  
  6176.  
  6177.  
  6178.  
  6179.           MOUSESENSSET
  6180.  
  6181.             PROTOTYPE
  6182.  
  6183.             SUB MOUSESENSSET (XSens%, Ysens%, DblSpdTresh%)
  6184.  
  6185.             INPUT
  6186.  
  6187.             XSens - number of mickeys per 8 pixels horizontally (default =
  6188.             4 mickeys per pixel)
  6189.             YSens - number of mickeys per 8 pixels vertically (default = 4
  6190.             mickeys per pixel)
  6191.             DblSpdThresh = number of mickeys per second at which speed is
  6192.             doubled (default = 8)
  6193.  
  6194.             OUTPUT
  6195.  
  6196.             no value returned
  6197.  
  6198.             USAGE
  6199.  
  6200.             MOUSESENSSET defines the relationship between mouse movement
  6201.             and cursor movement on the screen.  A mickey is defined as
  6202.             1/200th of an inch.  The ratio between mickeys and pixels is
  6203.             specified by XSens and YSens in the horizontal and vertical
  6204.             directions respectively.  When the mouse movement is faster
  6205.             than DblSpdThresh in mickeys per second, the speed is doubled.
  6206.             The default values are assigned whenever MOUSEENTER is called.
  6207.  
  6208.             SEE ALSO
  6209.  
  6210.             MOUSEENTER, MOUSEEXIT, MOUSESTATUS
  6211.  
  6212.             EXAMPLE
  6213.  
  6214.             REM ENABLE, SHOW THE MOUSE AND MAKE IT VERY SENSITIVE
  6215.             REM $INCLUDE: 'SVGABC.BI'
  6216.             DEFINT A-Z
  6217.  
  6218.             VMODE = VIDEOMODEGET
  6219.             IF WHICHVGA = 0 THEN STOP
  6220.             IF WHICHMOUSE = 0 THEN STOP
  6221.             DUMMY=RES640
  6222.             MOUSEENTER
  6223.             MOUSESHOW
  6224.             MOUSESENSSET 2, 2, 4
  6225.             WHILE INKEY$ = ""
  6226.             WEND
  6227.             MOUSEEXIT
  6228.             VIDEOMODESET VMODE
  6229.             END
  6230.  
  6231.  
  6232.  
  6233.  
  6234.  
  6235.                                                                          99
  6236.  
  6237.  
  6238.  
  6239.  
  6240.  
  6241.           MOUSESHOW
  6242.  
  6243.             PROTOTYPE
  6244.  
  6245.             SUB MOUSESHOW ()
  6246.  
  6247.             INPUT
  6248.  
  6249.             no input parameters
  6250.  
  6251.             OUTPUT
  6252.  
  6253.             no value returned
  6254.  
  6255.             USAGE
  6256.  
  6257.             MOUSESHOW enables the mouse display driver and places the
  6258.             cursor on the screen.  The cursor is only updated when the
  6259.             mouse is moved.  Therefore, it is recommended to hide the
  6260.             cursor when drawing on the screen to avoid unexpected results.
  6261.  
  6262.             SEE ALSO
  6263.  
  6264.             MOUSEENTER, MOUSEEXIT, MOUSEHIDE
  6265.  
  6266.             EXAMPLE
  6267.  
  6268.             See MOUSEHIDE
  6269.  
  6270.  
  6271.  
  6272.  
  6273.  
  6274.  
  6275.  
  6276.  
  6277.  
  6278.  
  6279.  
  6280.  
  6281.  
  6282.  
  6283.  
  6284.  
  6285.  
  6286.  
  6287.  
  6288.  
  6289.  
  6290.  
  6291.  
  6292.  
  6293.  
  6294.  
  6295.  
  6296.  
  6297.                                                                         100
  6298.  
  6299.  
  6300.  
  6301.  
  6302.  
  6303.           MOUSESTATUS
  6304.  
  6305.             PROTOTYPE
  6306.  
  6307.             SUB MOUSESTATUS (X%, Y%, MouseButs%)
  6308.  
  6309.             INPUT
  6310.  
  6311.             no input parameters
  6312.  
  6313.             OUTPUT
  6314.  
  6315.             no value returned
  6316.             X, Y - mouse position on screen
  6317.             MouseButs - status of mouse buttons
  6318.  
  6319.             USAGE
  6320.  
  6321.             MOUSESTATUS returns the current status of the mouse position
  6322.             and buttons.  The position is returned in X, Y.  The buttons'
  6323.             status is held in MouseButs.  The left button is held in bit
  6324.             zero, right button in bit one and center button - for three
  6325.             button mice - in bit two.  Button status is most easily
  6326.             checked with a bitwise AND of MouseButs and the desired bit.
  6327.  
  6328.             SEE ALSO
  6329.  
  6330.             MOUSERANGESET, MOUSESENSSET
  6331.  
  6332.             EXAMPLE
  6333.  
  6334.             REM ENABLE, SHOW, DISPLAY MOUSE STATUS
  6335.             REM $INCLUDE: 'SVGABC.BI'
  6336.             DEFINT A-Z
  6337.             VMODE = VIDEOMODEGET
  6338.             IF WHICHVGA = 0 THEN STOP
  6339.             IF WHICHMOUSE = 0 THEN STOP
  6340.             DUMMY=RES640
  6341.             MOUSEENTER
  6342.             MOUSESHOW
  6343.             WHILE INKEY$ = ""
  6344.                MOUSESTATUS X, Y, MButs
  6345.                D$ = "MX=" + STR$(X)
  6346.                L = LEN(D$)
  6347.                IF L < 10 THEN
  6348.                  D$ = D$ + STRING$(8 - L, 32)
  6349.                END IF
  6350.                D$ = D$ + "MY=" + STR$(Y)
  6351.                L = LEN(D$)
  6352.                IF L < 20 THEN
  6353.                  D$ = D$ + STRING$(16 - L, 32)
  6354.                END IF
  6355.                D$ = D$ + "MBUTS=" + STR$(MButs)
  6356.                DRWSTRING 1, 15, 8, D$, 0, 0
  6357.  
  6358.  
  6359.                                                                         101
  6360.  
  6361.  
  6362.  
  6363.  
  6364.  
  6365.             WEND
  6366.             MOUSEEXIT
  6367.             VIDEOMODESET VMODE
  6368.             END
  6369.  
  6370.  
  6371.  
  6372.  
  6373.  
  6374.  
  6375.  
  6376.  
  6377.  
  6378.  
  6379.  
  6380.  
  6381.  
  6382.  
  6383.  
  6384.  
  6385.  
  6386.  
  6387.  
  6388.  
  6389.  
  6390.  
  6391.  
  6392.  
  6393.  
  6394.  
  6395.  
  6396.  
  6397.  
  6398.  
  6399.  
  6400.  
  6401.  
  6402.  
  6403.  
  6404.  
  6405.  
  6406.  
  6407.  
  6408.  
  6409.  
  6410.  
  6411.  
  6412.  
  6413.  
  6414.  
  6415.  
  6416.  
  6417.  
  6418.  
  6419.  
  6420.  
  6421.                                                                         102
  6422.  
  6423.  
  6424.  
  6425.  
  6426.  
  6427.           MOUSESTORAGESIZE
  6428.  
  6429.             PROTOTYPE
  6430.  
  6431.             FUNCTION MOUSESTORAGESIZE% ()
  6432.  
  6433.             INPUT
  6434.  
  6435.             no input parameters
  6436.  
  6437.             OUTPUT
  6438.  
  6439.             MOUSESTORAGESIZE returns the number of bytes needed to store
  6440.             the complete mouse status.
  6441.  
  6442.             USAGE
  6443.  
  6444.             MOUSESTORAGESIZE determines the proper size buffer to hold the
  6445.             complete mouse status information.  This buffer should be
  6446.             created before calling MOUSESAVESTATE.
  6447.  
  6448.             SEE ALSO
  6449.  
  6450.             MOUSERESTORESTATE, MOUSESAVESTATE
  6451.  
  6452.             EXAMPLE
  6453.  
  6454.             REM RETURN THE SIZE IN BYTES NEEDED TO SAVE THE MOUSE STATUS
  6455.             REM $INCLUDE: 'SVGABC.BI'
  6456.             DEFINT A-Z
  6457.  
  6458.             CLS
  6459.             IF WHICHMOUSE = 0 THEN STOP
  6460.             A$ = "The Mouse Driver Requires A" + STR$(MOUSESTORAGESIZE) +
  6461.             " Byte Buffer "
  6462.             A$ = A$ + "To Save Current Status."
  6463.             PRINT A$
  6464.             PRINT
  6465.             WHILE INKEY$ = ""
  6466.             WEND
  6467.             END
  6468.  
  6469.  
  6470.  
  6471.  
  6472.  
  6473.  
  6474.  
  6475.  
  6476.  
  6477.  
  6478.  
  6479.  
  6480.  
  6481.  
  6482.  
  6483.                                                                         103
  6484.  
  6485.  
  6486.  
  6487.  
  6488.  
  6489.           OVERSCANSET
  6490.  
  6491.             PROTOTYPE
  6492.  
  6493.             SUB OVERSCANSET (Color%)
  6494.  
  6495.             INPUT
  6496.  
  6497.             Color - index to color in current palette
  6498.  
  6499.             OUTPUT
  6500.  
  6501.             no value returned
  6502.  
  6503.             USAGE
  6504.  
  6505.             OVERSCANSET sets the overscan region to the specified color.
  6506.             The overscan region is the area between the usable pixel area
  6507.             and the region not scanned by the monitor.  Normally, the
  6508.             overscan is color zero which is defined as black the majority
  6509.             of the time.  The overscan color is reset to zero anytime a
  6510.             RES### function is called.
  6511.  
  6512.             Note: OVERSCANSET always works in the 320x200 resolution.  In
  6513.             the higher resolutions on many common SVGA cards this function
  6514.             is ignored.  Instead, the card always assigns the overscan
  6515.             region to color zero.  Therefore, it is recommended to not use
  6516.             OVERSCANSET, but assign color zero as needed.
  6517.  
  6518.             EXAMPLE
  6519.  
  6520.             REM SET THE OVERSCAN COLOR TO GREEN
  6521.             REM $INCLUDE: 'SVGABC.BI'
  6522.             DEFINT A-Z
  6523.             VMODE = VIDEOMODEGET
  6524.             IF WHICHVGA = 0 THEN STOP
  6525.             RES320
  6526.             OVERSCANSET 10
  6527.             WHILE INKEY$ = ""
  6528.             WEND
  6529.             VIDEOMODESET VMODE
  6530.             END
  6531.  
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.  
  6538.  
  6539.  
  6540.  
  6541.  
  6542.  
  6543.  
  6544.  
  6545.                                                                         104
  6546.  
  6547.  
  6548.  
  6549.  
  6550.  
  6551.           PAGEACTIVE
  6552.  
  6553.             PROTOTYPE
  6554.  
  6555.             FUNCTION PAGEACTIVE (Page%)
  6556.  
  6557.             INPUT
  6558.  
  6559.             Page - number of page to make active
  6560.  
  6561.             OUTPUT
  6562.  
  6563.             PAGEACTIVE returns a 1 if successful, 0 if unsuccessful.
  6564.  
  6565.             USAGE
  6566.  
  6567.             PAGEACTIVE sets the active page as specified by Page.  It
  6568.             works by creating an offset to be added when any bank
  6569.             switching is performed.  This function does not affect the
  6570.             actual display.  A page is defined as the number of 64K blocks
  6571.             necessary to contain the current screen resolution.  For
  6572.             example, 640x480 requires 307,200 bytes which is a little more
  6573.             than 4.5 64K blocks.  One page in this resolution will be 5
  6574.             banks.
  6575.  
  6576.             PAGEACTIVE does not work in 320x200 mode since this mode uses
  6577.             no bank switching.
  6578.  
  6579.             SEE ALSO
  6580.  
  6581.             PAGEDISPLAY
  6582.  
  6583.             EXAMPLE
  6584.  
  6585.             REM SHOW PAGEACTIVE FUNCTION
  6586.             REM THIS EXAMPLE REQUIRES 1 MEG OF VIDEO MEMORY
  6587.             REM $INCLUDE: 'SVGABC.BI'
  6588.             DEFINT A-Z
  6589.  
  6590.             IF WHICHVGA = 0 THEN
  6591.                END
  6592.             END IF
  6593.             IF WHICHMEM < 1024 THEN
  6594.                END
  6595.             END IF
  6596.             IF RES640 = 0 THEN
  6597.                END
  6598.             END IF
  6599.  
  6600.             REM MAKE SURE VIDEO CARD SUPPORTS PAGE FLIPPING
  6601.             IF PAGEDISPLAY(0, 0, 0) = 0 THEN
  6602.                DUMMY = RESTEXT
  6603.             END
  6604.             END IF
  6605.  
  6606.  
  6607.                                                                         105
  6608.  
  6609.  
  6610.  
  6611.  
  6612.  
  6613.             DUMMY = PAGEACTIVE(0)
  6614.             FILLPAGE 0
  6615.             DRWSTRING 1, 10, 0, "PAGE 0", 0, 0
  6616.             DRWSTRING 1, 10, 0, "PRESS A KEY...", 0, 300
  6617.             DUMMY = PAGEACTIVE(1)
  6618.             FILLPAGE 0
  6619.             DRWSTRING 1, 12, 0, "PAGE 1", 0, 20
  6620.             DRWSTRING 1, 12, 0, "PRESS A KEY...", 0, 300
  6621.             DUMMY = PAGEACTIVE(2)
  6622.             FILLPAGE 0
  6623.             DRWSTRING 1, 13, 0, "PAGE 2", 0, 40
  6624.             DRWSTRING 1, 13, 0, "PRESS A KEY...", 0, 300
  6625.             DUMMY = PAGEDISPLAY(0, 0, 0)
  6626.             WHILE INKEY$ = ""
  6627.             WEND
  6628.             DUMMY = PAGEDISPLAY(0, 0, 1)
  6629.             WHILE INKEY$ = ""
  6630.             WEND
  6631.             DUMMY = PAGEDISPLAY(0, 0, 2)
  6632.             WHILE INKEY$ = ""
  6633.             WEND
  6634.             DUMMY = RESTEXT
  6635.             CLS
  6636.             END
  6637.  
  6638.  
  6639.  
  6640.  
  6641.  
  6642.  
  6643.  
  6644.  
  6645.  
  6646.  
  6647.  
  6648.  
  6649.  
  6650.  
  6651.  
  6652.  
  6653.  
  6654.  
  6655.  
  6656.  
  6657.  
  6658.  
  6659.  
  6660.  
  6661.  
  6662.  
  6663.  
  6664.  
  6665.  
  6666.  
  6667.  
  6668.  
  6669.                                                                         106
  6670.  
  6671.  
  6672.  
  6673.  
  6674.  
  6675.           PAGEDISPLAY
  6676.  
  6677.             PROTOTYPE
  6678.  
  6679.             FUNCTION PAGEDISPLAY (X%, Y%, Page%)
  6680.  
  6681.             INPUT
  6682.  
  6683.             X, Y - coordinate to place at top, left of display
  6684.             Page - number of page to make active
  6685.  
  6686.             OUTPUT
  6687.  
  6688.             PAGEACTIVE returns a 1 if successful, 0 if unsuccessful.
  6689.  
  6690.             USAGE
  6691.  
  6692.             PAGEDISPLAY tells the video card where in video memory to
  6693.             begin the display.  This display offset is calculated from the
  6694.             specified Page, X and Y.  This is done by multiplying Y times
  6695.             the width of the current resolution, adding X and then adding
  6696.             the appropriate number of 64K blocks for Page.  X, Y and Page
  6697.             must all be positive numbers, but are otherwise not
  6698.             restricted.  The display will wrap if the values are
  6699.             abnormally large.  Wrapping will happen from side to side as
  6700.             well as from top of memory to bottom of memory.
  6701.  
  6702.             PAGEDISPLAY does not work in 320x200 mode since this mode uses
  6703.             no bank switching.  In addition, older models of some SVGA
  6704.             cards operating in native mode do not support paging.  In this
  6705.             library these cards are: Acumos, Ahead version A, Everex and
  6706.             Genoa.  To ensure compatibility, a program should make a call
  6707.             similar to:
  6708.  
  6709.             RET = PAGEDISPLAY(0,0,0)
  6710.             IF RET = 0 THEN PRINT "PAGING NOT SUPPORTED"
  6711.  
  6712.             Note: SVGA cards by ATI Technologies appear to ignore bit 4
  6713.             (counting from 0 to 19) in its linear addressing mode and
  6714.             assume it is zero.  Therefore, bit 4 of the x parameter will
  6715.             be ignored by ATI chipsets.
  6716.  
  6717.             SEE ALSO
  6718.  
  6719.             PAGEACTIVE
  6720.  
  6721.             EXAMPLE
  6722.  
  6723.             See PAGEACTIVE
  6724.  
  6725.  
  6726.  
  6727.  
  6728.  
  6729.  
  6730.  
  6731.                                                                         107
  6732.  
  6733.  
  6734.  
  6735.  
  6736.  
  6737.           PALCHGAUTO
  6738.  
  6739.             PROTOTYPE
  6740.  
  6741.             SUB PALCHGAUTO (Pal$, NewPal$, FirstColor%, LastColor%,
  6742.             Speed%)
  6743.  
  6744.             INPUT
  6745.  
  6746.             Pal$ - string * 768 containing initial palette
  6747.             NewPal$ - string *768 containing new palette
  6748.             FirstColor - index into palette where change will begin
  6749.             LastColor - index into palette where change will end
  6750.             Speed - speed of change
  6751.  
  6752.             OUTPUT
  6753.  
  6754.             no value returned
  6755.  
  6756.             USAGE
  6757.  
  6758.             PALCHGAUTO smoothly fades the colors between FirstColor and
  6759.             LastColor from the palette Pal$ to NewPal$.  The speed of the
  6760.             fade is set by Speed which is percentage change between each
  6761.             step of the fade.  Only values between 1 and 128 are valid
  6762.             where 1 represents a one percent change between steps and 128
  6763.             (80 hex) represents fifty percent change between steps.  A
  6764.             Speed of 128 would then have only two steps.  A Speed outside
  6765.             of the valid range causes the function to immediately return
  6766.             without making any changes.  The time required to accomplish
  6767.             the entire fade is approximately equal to 0.033 seconds times
  6768.             256 divided by Speed.  PALCHGAUTO does not modify either Pal$
  6769.             or NewPal$.
  6770.  
  6771.             SEE ALSO
  6772.  
  6773.             PALCHGSTEP, PALDIMSTEP, PALIOAUTO
  6774.  
  6775.             EXAMPLE
  6776.  
  6777.             REM AUTOFADE FROM ONE PALETTE TO ANOTHER AND BACK AGAIN
  6778.             REM $INCLUDE: 'SVGABC.BI'
  6779.             DEFINT A-Z
  6780.             DIM PAL AS STRING * 768
  6781.             DIM NEWPAL AS STRING * 768
  6782.  
  6783.             VMODE = VIDEOMODEGET
  6784.             IF WHICHVGA = 0 THEN STOP
  6785.             IF WHICHMEM < 512 THEN STOP
  6786.             DUMMY=RES640
  6787.             PALGET PAL, 0, 255
  6788.             FOR I = 1 TO 768
  6789.                MID$(NEWPAL, I, 1) = MID$(PAL, 769 - I, 1)
  6790.             NEXT I
  6791.  
  6792.  
  6793.                                                                         108
  6794.  
  6795.  
  6796.  
  6797.  
  6798.  
  6799.             COLR = 0
  6800.             FOR I = 0 TO 639
  6801.                DRWLINE 1, COLR, I, 0, I, 479
  6802.                COLR = COLR + 1
  6803.                IF COLR > 255 THEN
  6804.                  COLR = 0
  6805.                END IF
  6806.             NEXT I
  6807.             PALCHGAUTO PAL, NEWPAL, 0, 255, 2
  6808.             PALCHGAUTO NEWPAL, PAL, 0, 255, 2
  6809.             WHILE INKEY$ = ""
  6810.             WEND
  6811.             VIDEOMODESET VMODE
  6812.             END
  6813.  
  6814.  
  6815.  
  6816.  
  6817.  
  6818.  
  6819.  
  6820.  
  6821.  
  6822.  
  6823.  
  6824.  
  6825.  
  6826.  
  6827.  
  6828.  
  6829.  
  6830.  
  6831.  
  6832.  
  6833.  
  6834.  
  6835.  
  6836.  
  6837.  
  6838.  
  6839.  
  6840.  
  6841.  
  6842.  
  6843.  
  6844.  
  6845.  
  6846.  
  6847.  
  6848.  
  6849.  
  6850.  
  6851.  
  6852.  
  6853.  
  6854.  
  6855.                                                                         109
  6856.  
  6857.  
  6858.  
  6859.  
  6860.  
  6861.           PALCHGSTEP
  6862.  
  6863.             PROTOTYPE
  6864.  
  6865.             SUB PALCHGSTEP (Pal$, NewPal$, FirstColor%, LastColor%,
  6866.             Percent%)
  6867.  
  6868.             INPUT
  6869.  
  6870.             Pal$ - string * 768 containing initial palette
  6871.             NewPal$ - string * 768 containing new palette
  6872.             FirstColor - index into palette where change will begin
  6873.             LastColor - index into palette where change will end
  6874.             Percent - percent step from current palette to new palette
  6875.  
  6876.             OUTPUT
  6877.  
  6878.             no value returned
  6879.  
  6880.             USAGE
  6881.  
  6882.             PALCHGSTEP changes the palette colors between FirstColor and
  6883.             LastColor by Percent from Pal$ to NewPal$.  This function
  6884.             works very much like PALCHGAUTO except it only takes a single
  6885.             step and returns.  The step taken is a percentage specified by
  6886.             Percent where 256 (100 hex) is a 100 percent change.  The
  6887.             valid range for Percent is 0 to 256.  Values beyond this range
  6888.             cause the function to immediately return without making any
  6889.             changes.  A loop from 4 to 256 by fours using PALCHGSTEP would
  6890.             have similar results as PALCHGAUTO with a speed of 4.  Neither
  6891.             Pal$, nor NewPal$ are modified.
  6892.  
  6893.             SEE ALSO
  6894.  
  6895.             PALCHGAUTO, PALDIMSTEP, PALIOAUTO
  6896.  
  6897.             EXAMPLE
  6898.  
  6899.             REM STEP FADE FROM ONE PALETTE TO ANOTHER AND BACK AGAIN FAST
  6900.             REM $INCLUDE: 'SVGABC.BI'
  6901.             DEFINT A-Z
  6902.             DIM PAL AS STRING * 768
  6903.             DIM NEWPAL AS STRING * 768
  6904.  
  6905.             VMODE = VIDEOMODEGET
  6906.             IF WHICHVGA = 0 THEN STOP
  6907.             IF WHICHMEM < 512 THEN STOP
  6908.             DUMMY=RES640
  6909.             PALGET PAL, 0, 255
  6910.             FOR I = 1 TO 768
  6911.                MID$(NEWPAL, I, 1) = MID$(PAL, 769 - I, 1)
  6912.             NEXT I
  6913.             COLR = 0
  6914.             FOR I = 0 TO 639
  6915.  
  6916.  
  6917.                                                                         110
  6918.  
  6919.  
  6920.  
  6921.  
  6922.  
  6923.                DRWLINE 1, COLR, I, 0, I, 479
  6924.                COLR = COLR + 1
  6925.                IF COLR > 255 THEN
  6926.                  COLR = 0
  6927.                END IF
  6928.             NEXT I
  6929.             FOR I = 1 TO 255 STEP 2
  6930.                PALCHGSTEP PAL, NEWPAL, 0, 255, I
  6931.             NEXT I
  6932.             FOR I = 1 TO 255 STEP 16
  6933.                PALCHGSTEP NEWPAL, PAL, 0, 255, I
  6934.             NEXT I
  6935.             WHILE INKEY$ = ""
  6936.             WEND
  6937.             VIDEOMODESET VMODE
  6938.             END
  6939.  
  6940.  
  6941.  
  6942.  
  6943.  
  6944.  
  6945.  
  6946.  
  6947.  
  6948.  
  6949.  
  6950.  
  6951.  
  6952.  
  6953.  
  6954.  
  6955.  
  6956.  
  6957.  
  6958.  
  6959.  
  6960.  
  6961.  
  6962.  
  6963.  
  6964.  
  6965.  
  6966.  
  6967.  
  6968.  
  6969.  
  6970.  
  6971.  
  6972.  
  6973.  
  6974.  
  6975.  
  6976.  
  6977.  
  6978.  
  6979.                                                                         111
  6980.  
  6981.  
  6982.  
  6983.  
  6984.  
  6985.           PALCOPY
  6986.  
  6987.             PROTOTYPE
  6988.  
  6989.             SUB PALCOPY (SrcPalette$, DestPalette$, FirstColor%,
  6990.             LastColor%)
  6991.  
  6992.             INPUT
  6993.  
  6994.             SrcPalette$ - string * 768 containing source palette
  6995.             FirstColor - index into palette where copy will begin
  6996.             LastColor - index into palette where copy will end
  6997.  
  6998.             OUTPUT
  6999.  
  7000.             no value returned
  7001.             DestPalette$ - string * 768 containing copy of source palette
  7002.  
  7003.             USAGE
  7004.  
  7005.             PALCOPY quickly copies a source palette into a second palette
  7006.             array.  The source and destination must both be defined as
  7007.             string * 768 or PALCOPY will return without making any copy.
  7008.             A portion of a palette may be copied by specifying first and
  7009.             last colors.
  7010.  
  7011.             SEE ALSO
  7012.  
  7013.             BYTECOPY
  7014.  
  7015.             EXAMPLE
  7016.  
  7017.             REM SHOW PAL COPY
  7018.             REM $INCLUDE: 'SVGABC.BI'
  7019.             DEFINT A-Z
  7020.             DIM PAL1 AS STRING * 768
  7021.             DIM PAL2 AS STRING * 768
  7022.             VMODE = VIDEOMODEGET
  7023.             IF WHICHVGA = 0 THEN STOP
  7024.             IF WHICHMEM < 512 THEN STOP
  7025.             DUMMY = RES640
  7026.             FOR I = 0 TO 255
  7027.                MID$(PAL1, I * 3 + 1, 1) = CHR$(I)
  7028.                MID$(PAL1, I * 3 + 2, 1) = CHR$(I)
  7029.                MID$(PAL1, I * 3 + 3, 1) = CHR$(I)
  7030.             NEXT I
  7031.             COLR = 0
  7032.             FOR I = 0 TO 639
  7033.                DRWLINE 1, COLR, I, 0, I, 479
  7034.                COLR = COLR + 1
  7035.                IF COLR > 255 THEN COLR = 0
  7036.             NEXT I
  7037.             PALCOPY PAL1, PAL2, 0, 255
  7038.             PALSET PAL2, 0, 255
  7039.  
  7040.  
  7041.                                                                         112
  7042.  
  7043.  
  7044.  
  7045.  
  7046.  
  7047.             WHILE INKEY$ = ""
  7048.             WEND
  7049.             VIDEOMODESET VMODE
  7050.             END
  7051.  
  7052.  
  7053.  
  7054.  
  7055.  
  7056.  
  7057.  
  7058.  
  7059.  
  7060.  
  7061.  
  7062.  
  7063.  
  7064.  
  7065.  
  7066.  
  7067.  
  7068.  
  7069.  
  7070.  
  7071.  
  7072.  
  7073.  
  7074.  
  7075.  
  7076.  
  7077.  
  7078.  
  7079.  
  7080.  
  7081.  
  7082.  
  7083.  
  7084.  
  7085.  
  7086.  
  7087.  
  7088.  
  7089.  
  7090.  
  7091.  
  7092.  
  7093.  
  7094.  
  7095.  
  7096.  
  7097.  
  7098.  
  7099.  
  7100.  
  7101.  
  7102.  
  7103.                                                                         113
  7104.  
  7105.  
  7106.  
  7107.  
  7108.  
  7109.           PALDIMSTEP
  7110.  
  7111.             PROTOTYPE
  7112.  
  7113.             SUB PALDIMSTEP (Pal$, FirstColor%, LastColor%, Percent%)
  7114.  
  7115.             INPUT
  7116.  
  7117.             Pal$ - string * 768 containing initial palette
  7118.             FirstColor - index into palette where dim will begin
  7119.             LastColor - index into palette where dim will end
  7120.             Percent - percent step from current palette to black
  7121.  
  7122.             OUTPUT
  7123.  
  7124.             no value returned
  7125.  
  7126.             USAGE
  7127.  
  7128.             PALDIMSTEP fades the specified palette to black by the given
  7129.             percentage between FirstColor and LastColor.  The percentage
  7130.             step from Pal$ to black is specified by Percent where 256 (100
  7131.             hex) is full black.  The valid range for Percent is 0 to 256.
  7132.             Values beyond this range cause the function to immediately
  7133.             return without making any changes.  Pal$ is not modified.
  7134.  
  7135.             SEE ALSO
  7136.  
  7137.             PALCHGAUTO, PALCHGSTEP, PALIOAUTO
  7138.  
  7139.             EXAMPLE
  7140.  
  7141.             REM STEP FADE OUT AND BACK IN FAST
  7142.             REM $INCLUDE: 'SVGABC.BI'
  7143.             DEFINT A-Z
  7144.             DIM PAL AS STRING * 768
  7145.  
  7146.             VMODE = VIDEOMODEGET
  7147.             IF WHICHVGA = 0 THEN STOP
  7148.             IF WHICHMEM < 512 THEN STOP
  7149.             DUMMY=RES640
  7150.             PALGET PAL, 0, 255
  7151.             COLR = 0
  7152.             FOR I = 0 TO 639
  7153.                DRWLINE 1, COLR, I, 0, I, 479
  7154.                COLR = COLR + 1
  7155.                IF COLR > 255 THEN COLR = 0
  7156.             NEXT I
  7157.             FOR I = 255 TO 0 STEP -2
  7158.                PALDIMSTEP PAL, 0, 255, I
  7159.             NEXT I
  7160.             FOR I = 1 TO 255 STEP 16
  7161.                PALDIMSTEP PAL, 0, 255, I
  7162.             NEXT I
  7163.  
  7164.  
  7165.                                                                         114
  7166.  
  7167.  
  7168.  
  7169.  
  7170.  
  7171.             WHILE INKEY$ = ""
  7172.             WEND
  7173.             VIDEOMODESET VMODE
  7174.             END
  7175.  
  7176.  
  7177.  
  7178.  
  7179.  
  7180.  
  7181.  
  7182.  
  7183.  
  7184.  
  7185.  
  7186.  
  7187.  
  7188.  
  7189.  
  7190.  
  7191.  
  7192.  
  7193.  
  7194.  
  7195.  
  7196.  
  7197.  
  7198.  
  7199.  
  7200.  
  7201.  
  7202.  
  7203.  
  7204.  
  7205.  
  7206.  
  7207.  
  7208.  
  7209.  
  7210.  
  7211.  
  7212.  
  7213.  
  7214.  
  7215.  
  7216.  
  7217.  
  7218.  
  7219.  
  7220.  
  7221.  
  7222.  
  7223.  
  7224.  
  7225.  
  7226.  
  7227.                                                                         115
  7228.  
  7229.  
  7230.  
  7231.  
  7232.  
  7233.           PALGET
  7234.  
  7235.             PROTOTYPE
  7236.  
  7237.             SUB PALGET (Pal$, FirstColor, LastColor%)
  7238.  
  7239.             INPUT
  7240.  
  7241.             Pal$ - string * 768 to hold current palette
  7242.             FirstColor - index into palette where get will begin
  7243.             LastColor - index into palette where get will end
  7244.  
  7245.             OUTPUT
  7246.  
  7247.             Pal$ - string * 768 containing the current palette in the
  7248.             specified range
  7249.  
  7250.             USAGE
  7251.  
  7252.             PALGET returns in Pal$ the colors from the current palette
  7253.             between FirstColor and LastColor.  Only colors in the
  7254.             specified range are returned and all others in Pal$ are
  7255.             unchanged.  Pal$ must have a length of 768 characters despite
  7256.             the number of colors retrieved.
  7257.  
  7258.             SEE ALSO
  7259.  
  7260.             PALROTATE, PALSET
  7261.  
  7262.             EXAMPLE
  7263.  
  7264.             REM GET THE CURRENT PALETTE IN THE VARIABLE 'PAL'
  7265.             REM $INCLUDE: 'SVGABC.BI'
  7266.             DEFINT A-Z
  7267.             DIM PAL AS STRING * 768
  7268.  
  7269.             VMODE = VIDEOMODEGET
  7270.             IF WHICHVGA = 0 THEN STOP
  7271.             IF WHICHMEM < 512 THEN STOP
  7272.             DUMMY=RES640
  7273.             PALGET PAL, 0, 255
  7274.             VIDEOMODESET VMODE
  7275.             CLS
  7276.             PRINT "GOT IT IN 'PAL'..."
  7277.             WHILE INKEY$ = ""
  7278.             WEND
  7279.             END
  7280.  
  7281.  
  7282.  
  7283.  
  7284.  
  7285.  
  7286.  
  7287.  
  7288.  
  7289.                                                                         116
  7290.  
  7291.  
  7292.  
  7293.  
  7294.  
  7295.           PALIOAUTO
  7296.  
  7297.             PROTOTYPE
  7298.  
  7299.             SUB PALIOAUTO (Pal$, FirstColor%, LastColor%, Speed%)
  7300.  
  7301.             INPUT
  7302.  
  7303.             Pal$ - string *768 containing initial palette
  7304.             FirstColor - index into palette where fade will begin
  7305.             LastColor - index into palette where fade will end
  7306.             Speed - speed of fade
  7307.  
  7308.             OUTPUT
  7309.  
  7310.             no value returned
  7311.  
  7312.             USAGE
  7313.  
  7314.             PALIOAUTO smoothly fades the colors between FirstColor and
  7315.             LastColor of Pal$ to or from solid black.  The speed of the
  7316.             fade is set by Speed which is the percentage change between
  7317.             each step of the fade.  A positive Speed corresponds to fading
  7318.             from Pal$ to black and a negative Speed fades from black to
  7319.             Pal$.  Only values between -128 and +128 are valid where  1
  7320.             represents a one percent change between steps and  128 ( 80
  7321.             hex) represents fifty percent change between steps.  A Speed
  7322.             of 128 would then have only two steps.  A Speed outside of the
  7323.             valid range causes the function to immediately return without
  7324.             making any changes.  The time required to accomplish the
  7325.             entire fade is approximately equal to 0.033 seconds times 256
  7326.             divided by Speed.  PALIOAUTO does not modify Pal$.
  7327.  
  7328.             SEE ALSO
  7329.  
  7330.             PALCHGAUTO, PALCHGSTEP, PALDIMSTEP
  7331.  
  7332.             EXAMPLE
  7333.  
  7334.             REM FADE OUT AND BACK IN FAST
  7335.             REM $INCLUDE: 'SVGABC.BI'
  7336.             DEFINT A-Z
  7337.             DIM PAL AS STRING * 768
  7338.             VMODE = VIDEOMODEGET
  7339.             IF WHICHVGA = 0 THEN STOP
  7340.             IF WHICHMEM < 512 THEN STOP
  7341.             DUMMY=RES640
  7342.             PALGET PAL, 0, 255
  7343.             COLR = 0
  7344.             FOR I = 0 TO 639
  7345.                DRWLINE 1, COLR, I, 0, I, 479
  7346.                COLR = COLR + 1
  7347.                IF COLR > 255 THEN COLR = 0
  7348.             NEXT I
  7349.  
  7350.  
  7351.                                                                         117
  7352.  
  7353.  
  7354.  
  7355.  
  7356.  
  7357.             PALIOAUTO PAL, 0, 255, -2
  7358.             PALIOAUTO PAL, 0, 255, 16
  7359.             WHILE INKEY$ = ""
  7360.             WEND
  7361.             VIDEOMODESET VMODE
  7362.             END
  7363.  
  7364.  
  7365.  
  7366.  
  7367.  
  7368.  
  7369.  
  7370.  
  7371.  
  7372.  
  7373.  
  7374.  
  7375.  
  7376.  
  7377.  
  7378.  
  7379.  
  7380.  
  7381.  
  7382.  
  7383.  
  7384.  
  7385.  
  7386.  
  7387.  
  7388.  
  7389.  
  7390.  
  7391.  
  7392.  
  7393.  
  7394.  
  7395.  
  7396.  
  7397.  
  7398.  
  7399.  
  7400.  
  7401.  
  7402.  
  7403.  
  7404.  
  7405.  
  7406.  
  7407.  
  7408.  
  7409.  
  7410.  
  7411.  
  7412.  
  7413.                                                                         118
  7414.  
  7415.  
  7416.  
  7417.  
  7418.  
  7419.           PALROTATE
  7420.  
  7421.             PROTOTYPE
  7422.  
  7423.             SUB PALROTATE (Pal$, FirstColor%, LastColor%, Shift%)
  7424.  
  7425.             INPUT
  7426.  
  7427.             Pal$ - string * 768 containing current palette
  7428.             FirstColor - index into palette where shift will begin
  7429.             LastColor - index into palette where shift will end
  7430.             Shift - number of locations to shift colors
  7431.  
  7432.             OUTPUT
  7433.  
  7434.             no value returned
  7435.  
  7436.             USAGE
  7437.  
  7438.             PALROTATE shifts the colors between FirstColor and LastColor
  7439.             by a given number of locations.  The number of locations the
  7440.             colors are moved is specified by Shift which is between 1 and
  7441.             256.  Pal$ is not modified by PALROTATE.
  7442.  
  7443.             SEE ALSO
  7444.  
  7445.             PALGET, PALSET
  7446.  
  7447.             EXAMPLE
  7448.  
  7449.             REM ROTATE A FEW PALETTE ENTRIES AROUND
  7450.             REM $INCLUDE: 'SVGABC.BI'
  7451.             DEFINT A-Z
  7452.             DIM PAL AS STRING * 768
  7453.  
  7454.             VMODE = VIDEOMODEGET
  7455.             IF WHICHVGA = 0 THEN STOP
  7456.             IF WHICHMEM < 512 THEN STOP
  7457.             DUMMY=RES640
  7458.             PALGET PAL, 0, 255
  7459.             COLR = 0
  7460.             FOR I = 0 TO 639
  7461.                DRWLINE 1, COLR, I, 0, I, 479
  7462.                COLR = COLR + 1
  7463.                IF COLR > 255 THEN COLR = 0
  7464.             NEXT I
  7465.             FOR I = 0 TO 100
  7466.                PALROTATE PAL, 0, 127, 1
  7467.                PALGET PAL, 0, 255
  7468.             NEXT I
  7469.             WHILE INKEY$ = ""
  7470.             WEND
  7471.             VIDEOMODESET VMODE
  7472.             END
  7473.  
  7474.  
  7475.                                                                         119
  7476.  
  7477.  
  7478.  
  7479.  
  7480.  
  7481.           PALSET
  7482.  
  7483.             PROTOTYPE
  7484.  
  7485.             SUB PALSET (Pal$, FirstColor%, LastColor%)
  7486.  
  7487.             INPUT
  7488.  
  7489.             Pal$ - string * 768 containing the palette to set
  7490.             FirstColor - index into palette where set will begin
  7491.             LastColor - index into palette where set will end
  7492.  
  7493.             OUTPUT
  7494.  
  7495.             no value returned
  7496.  
  7497.             USAGE
  7498.  
  7499.             PALSET sets the specified range of colors in the current
  7500.             palette with the corresponding range in the palette Pal$.
  7501.  
  7502.             SEE ALSO
  7503.  
  7504.             PALGET
  7505.  
  7506.             EXAMPLE
  7507.  
  7508.             REM SET A NEW PALETTE
  7509.             REM $INCLUDE: 'SVGABC.BI'
  7510.             DEFINT A-Z
  7511.             DIM PAL AS STRING * 768
  7512.             DIM NEWPAL AS STRING * 768
  7513.  
  7514.             VMODE = VIDEOMODEGET
  7515.             IF WHICHVGA = 0 THEN STOP
  7516.             IF WHICHMEM < 512 THEN STOP
  7517.             DUMMY=RES640
  7518.             PALGET PAL, 0, 255
  7519.             FOR I = 1 TO 768
  7520.                MID$(NEWPAL, I, 1) = MID$(PAL, 769 - I, 1)
  7521.             NEXT I
  7522.             COLR = 0
  7523.             FOR I = 0 TO 639
  7524.                DRWLINE 1, COLR, I, 0, I, 479
  7525.                COLR = COLR + 1
  7526.                IF COLR > 255 THEN COLR = 0
  7527.             NEXT I
  7528.             PALSET NEWPAL, 0, 255
  7529.             WHILE INKEY$ = ""
  7530.             WEND
  7531.             VIDEOMODESET VMODE
  7532.             END
  7533.  
  7534.  
  7535.  
  7536.  
  7537.                                                                         120
  7538.  
  7539.  
  7540.  
  7541.  
  7542.  
  7543.           PCXGETINFO
  7544.  
  7545.             PROTOTYPE
  7546.  
  7547.             FUNCTION PCXGETINFO% (Filename$, Width%, Height%, NumColors%,
  7548.             Palette$)
  7549.  
  7550.             INPUT
  7551.  
  7552.             Filename$ - the filename of the PCX image to read
  7553.  
  7554.             OUTPUT
  7555.  
  7556.             PCXGETINFO returns the status of the function (1 = success).
  7557.             Width - the width in pixels of the image
  7558.             Height - the height in pixels of the image
  7559.             NumColors - the number of colors in the image palette
  7560.             Palette$ - string*768 containing the image palette
  7561.  
  7562.             USAGE
  7563.  
  7564.             PCXGETINFO reads Filename$ and returns the characteristics of
  7565.             the image.  The dimensions of the image are returned in Width,
  7566.             Height.  The number of colors in the image's palette is
  7567.             returned in NumColors and the palette is returned in Palette$.
  7568.             Although the image's palette may contain less than 256 colors,
  7569.             Palette$ must be 768 characters in length.  The image's
  7570.             palette will begin with the first character of Palette$.
  7571.  
  7572.             PCX version 3.0 is the only specification for 256 color
  7573.             images.  Therefore, only version 3.0 PCX files are accepted.
  7574.  
  7575.             If PCXGETINFO determines that Filename$ is a satisfactory
  7576.             file, the function will return a one.  Otherwise, the function
  7577.             will return one of several error codes concerning Filename$ as
  7578.             listed below:
  7579.  
  7580.             0 =  does not exist or there is some disk I/O problem
  7581.             -1 = not a version 3.0 PCX file
  7582.             -2 = not run-length-encoded
  7583.             -3 = general error
  7584.  
  7585.             SEE ALSO
  7586.  
  7587.             PCXMAKE, PCXPUT
  7588.  
  7589.             EXAMPLE
  7590.  
  7591.             REM GET THE INFORMATION OF THE PCX FILE 'ZEPHYR.PCX'
  7592.             REM $INCLUDE: 'SVGABC.BI'
  7593.  
  7594.             DEFINT A-Z
  7595.             DIM PCXPAL AS STRING * 768
  7596.  
  7597.  
  7598.  
  7599.                                                                         121
  7600.  
  7601.  
  7602.  
  7603.  
  7604.  
  7605.             DUMMY = WHICHVGA
  7606.             CLS
  7607.             PCXFILENAME$ = "ZEPHYR.PCX"
  7608.             OK = PCXGETINFO(PCXFILENAME$, XSIZE, YSIZE, NUMCOL, PCXPAL)
  7609.             IF OK = 1 THEN
  7610.                A$ = "'" + PCXFILENAME$ + "' is identified as a PCX file"
  7611.                PRINT A$
  7612.                A$ = "Dimensions are:" + STR$(XSIZE) + " pixels wide and" +
  7613.             STR$(YSIZE)
  7614.                A$ = A$ + " pixels high"
  7615.                PRINT A$
  7616.                A$ = "Number of colors:" + STR$(NUMCOL)
  7617.                PRINT A$
  7618.             ELSE
  7619.                PRINT "There was an error! -"; OK
  7620.             END IF
  7621.             WHILE INKEY$ = ""
  7622.             WEND
  7623.             END
  7624.  
  7625.  
  7626.  
  7627.  
  7628.  
  7629.  
  7630.  
  7631.  
  7632.  
  7633.  
  7634.  
  7635.  
  7636.  
  7637.  
  7638.  
  7639.  
  7640.  
  7641.  
  7642.  
  7643.  
  7644.  
  7645.  
  7646.  
  7647.  
  7648.  
  7649.  
  7650.  
  7651.  
  7652.  
  7653.  
  7654.  
  7655.  
  7656.  
  7657.  
  7658.  
  7659.  
  7660.  
  7661.                                                                         122
  7662.  
  7663.  
  7664.  
  7665.  
  7666.  
  7667.           PCXMAKE
  7668.  
  7669.             PROTOTYPE
  7670.  
  7671.             FUNCTION PCXMAKE% (X1%, Y1%, X2%, Y2%, Filename$)
  7672.  
  7673.             INPUT
  7674.  
  7675.             X1, Y1 - the location of the top, left corner of the image
  7676.             X2, Y2 - the bottom, right corner of the image
  7677.             Filename$ - filename to store the PCX image
  7678.  
  7679.             OUTPUT
  7680.  
  7681.             PCXMAKE returns a 1 if successful, 0 if unsuccessful.
  7682.  
  7683.             USAGE
  7684.  
  7685.             PcxMAKE takes the bitmap enclosed in the box defined by (X1,
  7686.             Y1) - (X2, Y2) and writes a PCX file with the filename
  7687.             specified by Filename$.  The resulting file uses the version
  7688.             3.0 PCX specification.  X1, Y1, X2 and Y2 must be valid
  7689.             coordinates on the currently active page.  Filename$ may
  7690.             specify a full path and drive letter, if necessary.
  7691.  
  7692.             If PCXPUT encounters no problems, the function will return a
  7693.             one.  Otherwise, the function will return one of several error
  7694.             codes concerning Filename$ as listed below:
  7695.  
  7696.             0 =  disk I/O problem
  7697.             -1 = coordinates out of range
  7698.  
  7699.             SEE ALSO
  7700.  
  7701.             PCXGETINFO, PCXPUT
  7702.  
  7703.             EXAMPLE
  7704.  
  7705.             REM MAKE A 256 COLOR PCX FILE
  7706.             REM $INCLUDE: 'SVGABC.BI'
  7707.             DEFINT A-Z
  7708.             IF WHICHCPU < 386 THEN END
  7709.             IF WHICHVGA = 0 THEN END
  7710.  
  7711.             DUMMY = RES640
  7712.             FILLSCREEN 10
  7713.             FOR A = 0 TO 200
  7714.                X1 = RND * GETMAXX
  7715.                Y1 = RND * GETMAXY
  7716.                X2 = RND * GETMAXX
  7717.                Y2 = RND * GETMAXY
  7718.                C = RND * 255
  7719.                DRWLINE 1, C, X1, Y1, X2, Y2
  7720.             NEXT A
  7721.  
  7722.  
  7723.                                                                         123
  7724.  
  7725.  
  7726.  
  7727.  
  7728.  
  7729.             DRWBOX 1, 15, 0, 0, GETMAXX, GETMAXY
  7730.             A$ = "This PCX file was created using Zephyr Software's
  7731.             'PCXMAKE' function!"
  7732.             DRWSTRING 1, 15, 0, A$, 2, 2
  7733.             ER = PCXMAKE(0, 0, GETMAXX, GETMAXY, "TEST.PCX")
  7734.             WHILE INKEY$ = ""
  7735.             WEND
  7736.             DUMMY = RESTEXT
  7737.             IF ER <> 1 THEN
  7738.                PRINT "PCX MAKE ERROR! -"; ER
  7739.             END IF
  7740.             END
  7741.  
  7742.  
  7743.  
  7744.  
  7745.  
  7746.  
  7747.  
  7748.  
  7749.  
  7750.  
  7751.  
  7752.  
  7753.  
  7754.  
  7755.  
  7756.  
  7757.  
  7758.  
  7759.  
  7760.  
  7761.  
  7762.  
  7763.  
  7764.  
  7765.  
  7766.  
  7767.  
  7768.  
  7769.  
  7770.  
  7771.  
  7772.  
  7773.  
  7774.  
  7775.  
  7776.  
  7777.  
  7778.  
  7779.  
  7780.  
  7781.  
  7782.  
  7783.  
  7784.  
  7785.                                                                         124
  7786.  
  7787.  
  7788.  
  7789.  
  7790.  
  7791.           PCXPUT
  7792.  
  7793.             PROTOTYPE
  7794.  
  7795.             FUNCTION PCXPUT (Mode%, X%, Y%, Filename$)
  7796.  
  7797.             INPUT
  7798.  
  7799.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  7800.             X, Y - the location of the top, left corner of the PCX image
  7801.             Filename$ - filename of the PCX image to read
  7802.  
  7803.             OUTPUT
  7804.  
  7805.             PCXPUT returns the status of the function (1 = success).
  7806.  
  7807.             USAGE
  7808.  
  7809.             PCXPUT reads the PCX image from Filename$ and places it on the
  7810.             screen with the top, left corner at X, Y.  The image is
  7811.             automatically clipped to the currently defined viewport.  The
  7812.             image's palette should be previously obtained by using
  7813.             PCXGETINFO.
  7814.  
  7815.             PCX version 3.0 is the only specification for 256 color
  7816.             images.  Therefore, only version 3.0 PCX files are accepted.
  7817.  
  7818.             If PCXPUT encounters no problems, the function will return a
  7819.             one.  Otherwise, the function will return one of several error
  7820.             codes concerning Filename$ as listed below:
  7821.  
  7822.             0 =  does not exist or there is some disk I/O problem
  7823.             -1 = not a version 3.0 PCX file
  7824.             -2 = not run-length-encoded
  7825.             -3 = general error
  7826.  
  7827.             SEE ALSO
  7828.  
  7829.             PCXGETINFO, PCXMAKE, SETVIEW
  7830.  
  7831.             EXAMPLE
  7832.  
  7833.             REM DISPLAY THE PCX FILE 'ZEPHYR.PCX'
  7834.             REM $INCLUDE: 'SVGABC.BI'
  7835.             DEFINT A-Z
  7836.  
  7837.             DIM PCXPAL AS STRING * 768
  7838.  
  7839.             IF WHICHVGA = 0 THEN END
  7840.             PCXFILENAME$ = "ZEPHYR.PCX"
  7841.             IF RES640 = 0 THEN END
  7842.  
  7843.             OK = PCXGETINFO(PCXFILENAME$, XSIZE, YSIZE, NUMCOL, PCXPAL)
  7844.             IF OK = 1 THEN
  7845.  
  7846.  
  7847.                                                                         125
  7848.  
  7849.  
  7850.  
  7851.  
  7852.  
  7853.                FIXIT = 0
  7854.                FOR A = 1 TO NUMCOL * 3 STEP 3
  7855.                  R = ASC(MID$(PCXPAL, A, 1))
  7856.                  G = ASC(MID$(PCXPAL, A + 1, 1))
  7857.                  B = ASC(MID$(PCXPAL, A + 2, 1))
  7858.                  IF R > 63 THEN
  7859.                     FIXIT = 1
  7860.                     EXIT FOR
  7861.                  END IF
  7862.                  IF G > 63 THEN
  7863.                     FIXIT = 1
  7864.                     EXIT FOR
  7865.                  END IF
  7866.                  IF B > 63 THEN
  7867.                     FIXIT = 1
  7868.                     EXIT FOR
  7869.                  END IF
  7870.                NEXT A
  7871.                IF FIXIT = 1 THEN
  7872.                  FOR A = 1 TO NUMCOL * 3
  7873.                     C = ASC(MID$(PCXPAL, A, 1))
  7874.                     MID$(PCXPAL, A, 1) = CHR$(C \ 4)
  7875.                  NEXT A
  7876.                END IF
  7877.                PALSET PCXPAL, 0, 255
  7878.                OK = PCXPUT(1, 0, 0, PCXFILENAME$)
  7879.                IF OK <> 1 THEN
  7880.                  SOUND 100, 5
  7881.                  DUMMY = RESTEXT
  7882.                  END
  7883.                END IF
  7884.                WHILE INKEY$ = ""
  7885.                WEND
  7886.                DUMMY = RESTEXT
  7887.             END IF
  7888.  
  7889.             END
  7890.  
  7891.  
  7892.  
  7893.  
  7894.  
  7895.  
  7896.  
  7897.  
  7898.  
  7899.  
  7900.  
  7901.  
  7902.  
  7903.  
  7904.  
  7905.  
  7906.  
  7907.  
  7908.  
  7909.                                                                         126
  7910.  
  7911.  
  7912.  
  7913.  
  7914.  
  7915.           RES320
  7916.  
  7917.             PROTOTYPE
  7918.  
  7919.             FUNCTION RES320% ()
  7920.  
  7921.             INPUT
  7922.  
  7923.             no input parameters
  7924.  
  7925.             OUTPUT
  7926.  
  7927.             RES320 always returns a 1.
  7928.  
  7929.             USAGE
  7930.  
  7931.             RES320 sets video mode 0x13 which is the VGA standard 320x200
  7932.             graphics mode with 256 colors.  This function can be called
  7933.             without calling WHICHVGA first as this function requires only
  7934.             that a VGA card is present, not a Super VGA card.  If a VGA is
  7935.             not present, the system may crash.
  7936.  
  7937.             SEE ALSO
  7938.  
  7939.             RES640, RES640L, RES800, RES1024, RES1280, WHICHVGA
  7940.  
  7941.             EXAMPLE
  7942.  
  7943.             REM SET THE VIDEO MODE TO 320x200x256
  7944.             REM $INCLUDE: 'SVGABC.BI'
  7945.             DEFINT A-Z
  7946.  
  7947.             VMODE = VIDEOMODEGET
  7948.             IF WHICHVGA = 0 THEN STOP
  7949.             DUMMY=RES320
  7950.             DRWSTRING 1, 7, 0, "THIS IS THE 320x200x256 VIDEO MODE...", 0,
  7951.             0
  7952.             WHILE INKEY$ = ""
  7953.             WEND
  7954.             VIDEOMODESET VMODE
  7955.             END
  7956.  
  7957.  
  7958.  
  7959.  
  7960.  
  7961.  
  7962.  
  7963.  
  7964.  
  7965.  
  7966.  
  7967.  
  7968.  
  7969.  
  7970.  
  7971.                                                                         127
  7972.  
  7973.  
  7974.  
  7975.  
  7976.  
  7977.           RES640
  7978.  
  7979.             PROTOTYPE
  7980.  
  7981.             FUNCTION RES640% ()
  7982.  
  7983.             INPUT
  7984.  
  7985.             no input parameters
  7986.  
  7987.             OUTPUT
  7988.  
  7989.             RES640 returns 1 if successful, 0 otherwise.
  7990.  
  7991.             USAGE
  7992.  
  7993.             RES640 sets the video mode to 640x480 graphics mode with 256
  7994.             colors.  This function requires that a Super VGA card with at
  7995.             least 512K of video memory be present.  Also, WHICHVGA must be
  7996.             called first or the function will fail without changing the
  7997.             video mode.  If the video card does not have sufficient
  7998.             memory, RES640 will return without changing the video mode.
  7999.  
  8000.             SEE ALSO
  8001.  
  8002.             RES320, RES640L, RES800, RES1024, RES1280, WHICHVGA
  8003.  
  8004.             EXAMPLE
  8005.  
  8006.             REM SET THE VIDEO MODE TO 640x480x256
  8007.             REM $INCLUDE: 'SVGABC.BI'
  8008.             DEFINT A-Z
  8009.  
  8010.             VMODE = VIDEOMODEGET
  8011.             IF WHICHVGA = 0 THEN STOP
  8012.             IF WHICHMEM < 512 THEN STOP
  8013.             DUMMY=RES640
  8014.             DRWSTRING 1, 7, 0, "THIS IS THE 640x480x256 VIDEO MODE...", 0,
  8015.             0
  8016.             WHILE INKEY$ = ""
  8017.             WEND
  8018.             VIDEOMODESET VMODE
  8019.             END
  8020.  
  8021.  
  8022.  
  8023.  
  8024.  
  8025.  
  8026.  
  8027.  
  8028.  
  8029.  
  8030.  
  8031.  
  8032.  
  8033.                                                                         128
  8034.  
  8035.  
  8036.  
  8037.  
  8038.  
  8039.           RES640L
  8040.  
  8041.             PROTOTYPE
  8042.  
  8043.             FUNCTION RES640L% ()
  8044.  
  8045.             INPUT
  8046.  
  8047.             no input parameters
  8048.  
  8049.             OUTPUT
  8050.  
  8051.             RES640L returns 1 if successful, 0 otherwise.
  8052.  
  8053.             USAGE
  8054.  
  8055.             RES640L sets the video mode to 640x400 graphics mode with 256
  8056.             colors.  This function requires that a Super VGA card with at
  8057.             least 256K of video memory be present.  Also, WHICHVGA must be
  8058.             called first or the function will fail without changing the
  8059.             video mode.  If the video card does not have sufficient
  8060.             memory, RES640L will return without changing the video mode.
  8061.  
  8062.             Note: 640x400 is a non-standard resolution.  Not all SVGA
  8063.             cards recognized by this library support this video mode.
  8064.  
  8065.             SEE ALSO
  8066.  
  8067.             RES320, RES640, RES800, RES1024, RES1280, WHICHVGA
  8068.  
  8069.             EXAMPLE
  8070.  
  8071.             REM SET THE VIDEO MODE TO 640x400x256
  8072.             REM $INCLUDE: 'SVGABC.BI'
  8073.             DEFINT A-Z
  8074.  
  8075.             VMODE = VIDEOMODEGET
  8076.             IF WHICHVGA = 0 THEN STOP
  8077.             IF WHICHMEM < 256 THEN STOP
  8078.             DUMMY=RES640L
  8079.             DRWSTRING 1, 7, 0, "THIS IS THE 640x400x256 VIDEO MODE...", 0,
  8080.             0
  8081.             WHILE INKEY$ = ""
  8082.             WEND
  8083.             VIDEOMODESET VMODE
  8084.             END
  8085.  
  8086.  
  8087.  
  8088.  
  8089.  
  8090.  
  8091.  
  8092.  
  8093.  
  8094.  
  8095.                                                                         129
  8096.  
  8097.  
  8098.  
  8099.  
  8100.  
  8101.           RES800
  8102.  
  8103.             PROTOTYPE
  8104.  
  8105.             FUNCTION RES800% ()
  8106.  
  8107.             INPUT
  8108.  
  8109.             no input parameters
  8110.  
  8111.             OUTPUT
  8112.  
  8113.             RES800 returns 1 if successful, 0 otherwise.
  8114.  
  8115.             USAGE
  8116.  
  8117.             RES800 sets the video mode to 800x600 graphics mode with 256
  8118.             colors.  This function requires that a Super VGA card with at
  8119.             least 512K of video memory be present.  Also, WHICHVGA must be
  8120.             called first or the function will fail without changing the
  8121.             video mode.  If the video card does not have sufficient
  8122.             memory, RES800 will return without changing the video mode.
  8123.  
  8124.             SEE ALSO
  8125.  
  8126.             RES320, RES640, RES640L, RES1024, RES1280, WHICHVGA
  8127.  
  8128.             EXAMPLE
  8129.  
  8130.             REM SET THE VIDEO MODE TO 800x600x256
  8131.             REM $INCLUDE: 'SVGABC.BI'
  8132.             DEFINT A-Z
  8133.  
  8134.             VMODE = VIDEOMODEGET
  8135.             IF WHICHVGA = 0 THEN STOP
  8136.             IF WHICHMEM < 512 THEN STOP
  8137.             DUMMY=RES800
  8138.             DRWSTRING 1, 7, 0, "THIS IS THE 800x600x256 VIDEO MODE...", 0,
  8139.             0
  8140.             WHILE INKEY$ = ""
  8141.             WEND
  8142.             VIDEOMODESET VMODE
  8143.             END
  8144.  
  8145.  
  8146.  
  8147.  
  8148.  
  8149.  
  8150.  
  8151.  
  8152.  
  8153.  
  8154.  
  8155.  
  8156.  
  8157.                                                                         130
  8158.  
  8159.  
  8160.  
  8161.  
  8162.  
  8163.           RES1024
  8164.  
  8165.             PROTOTYPE
  8166.  
  8167.             FUNCTION RES1024% ()
  8168.  
  8169.             INPUT
  8170.  
  8171.             no input parameters
  8172.  
  8173.             OUTPUT
  8174.  
  8175.             RES1024 returns 1 if successful, 0 otherwise.
  8176.  
  8177.             USAGE
  8178.  
  8179.             RES1024 sets the video mode to 1024x768 graphics mode with 256
  8180.             colors.  This function requires that a Super VGA card with at
  8181.             least 1 Megabyte of video memory be present.  Also, WHICHVGA
  8182.             must be called first or the function will fail without
  8183.             changing the video mode.  If the video card does not have
  8184.             sufficient memory, RES1024 will return without changing the
  8185.             video mode.
  8186.  
  8187.             SEE ALSO
  8188.  
  8189.             RES320, RES640, RES640L, RES800, RES1280, WHICHVGA
  8190.  
  8191.             EXAMPLE
  8192.  
  8193.             REM SET THE VIDEO MODE TO 1024x768x256
  8194.             REM $INCLUDE: 'SVGABC.BI'
  8195.             DEFINT A-Z
  8196.  
  8197.             VMODE = VIDEOMODEGET
  8198.             IF WHICHVGA = 0 THEN STOP
  8199.             IF WHICHMEM < 1024 THEN STOP
  8200.             DUMMY=RES1024
  8201.             DRWSTRING 1, 7, 0, "THIS IS THE 1024x768x256 VIDEO MODE...",
  8202.             0, 0
  8203.             WHILE INKEY$ = ""
  8204.             WEND
  8205.             VIDEOMODESET VMODE
  8206.             END
  8207.  
  8208.  
  8209.  
  8210.  
  8211.  
  8212.  
  8213.  
  8214.  
  8215.  
  8216.  
  8217.  
  8218.  
  8219.                                                                         131
  8220.  
  8221.  
  8222.  
  8223.  
  8224.  
  8225.           RES1280
  8226.  
  8227.             PROTOTYPE
  8228.  
  8229.             FUNCTION RES1280% ()
  8230.  
  8231.             INPUT
  8232.  
  8233.             no input parameters
  8234.  
  8235.             OUTPUT
  8236.  
  8237.             RES1280 returns 1 if successful, 0 otherwise.
  8238.  
  8239.             USAGE
  8240.  
  8241.             RES1280 sets the video mode to 1280x1024 graphics mode with
  8242.             256 colors.  This function requires that a Super VGA card with
  8243.             at least 2 Megabytes of video memory be present.  Also,
  8244.             WHICHVGA must be called first or the function will fail
  8245.             without changing the video mode.  If the video card does not
  8246.             have sufficient memory, RES1280 will return without changing
  8247.             the video mode.
  8248.  
  8249.             SEE ALSO
  8250.  
  8251.             RES320, RES640, RES640L, RES800, RES1024, WHICHVGA
  8252.  
  8253.             EXAMPLE
  8254.  
  8255.             REM SET THE VIDEO MODE TO 1280x1024x256
  8256.             REM $INCLUDE: 'SVGABC.BI'
  8257.             DEFINT A-Z
  8258.  
  8259.             VMODE = VIDEOMODEGET
  8260.             IF WHICHVGA = 0 THEN STOP
  8261.             IF WHICHMEM < 2048 THEN STOP
  8262.             DUMMY=RES1024
  8263.             DRWSTRING 1, 7, 0, "THIS IS THE 1280x1024x256 VIDEO MODE...",
  8264.             0, 0
  8265.             WHILE INKEY$ = ""
  8266.             WEND
  8267.             VIDEOMODESET VMODE
  8268.             END
  8269.  
  8270.  
  8271.  
  8272.  
  8273.  
  8274.  
  8275.  
  8276.  
  8277.  
  8278.  
  8279.  
  8280.  
  8281.                                                                         132
  8282.  
  8283.  
  8284.  
  8285.  
  8286.  
  8287.           RESTEXT
  8288.  
  8289.             PROTOTYPE
  8290.  
  8291.             FUNCTION RESTEXT% ()
  8292.  
  8293.             INPUT
  8294.  
  8295.             no input parameters
  8296.  
  8297.             OUTPUT
  8298.  
  8299.             RESTEXT always returns a 1.
  8300.  
  8301.             USAGE
  8302.  
  8303.             RESTEXT sets video mode three which is the VGA standard 80x25
  8304.             text mode.
  8305.  
  8306.             SEE ALSO
  8307.  
  8308.             VIDEOMODEGET, VIDEOMODESET
  8309.  
  8310.             EXAMPLE
  8311.  
  8312.             REM SET THE VIDEO MODE TO STANDARD DOS TEXT MODE 3
  8313.             REM $INCLUDE: 'SVGABC.BI'
  8314.             DEFINT A-Z
  8315.  
  8316.             VMODE = VIDEOMODEGET
  8317.             RESTEXT
  8318.             PRINT "THIS IS THE TEXT VIDEO MODE (DOS VIDEO MODE 3)...
  8319.             WHILE INKEY$ = ""
  8320.             WEND
  8321.             VIDEOMODESET VMODE
  8322.             END
  8323.  
  8324.  
  8325.  
  8326.  
  8327.  
  8328.  
  8329.  
  8330.  
  8331.  
  8332.  
  8333.  
  8334.  
  8335.  
  8336.  
  8337.  
  8338.  
  8339.  
  8340.  
  8341.  
  8342.  
  8343.                                                                         133
  8344.  
  8345.  
  8346.  
  8347.  
  8348.  
  8349.           SCROLLDN
  8350.  
  8351.             PROTOTYPE
  8352.  
  8353.             SUB SCROLLDN (X1%, Y1%, X2%, Y2%, Num%, Color%)
  8354.  
  8355.             INPUT
  8356.  
  8357.             X1, Y1 - top left corner of block
  8358.             X2, Y2 - bottom right corner of block
  8359.             Num - number of pixels to shift
  8360.             Color - index to color in current palette
  8361.  
  8362.             OUTPUT
  8363.  
  8364.             no value returned
  8365.  
  8366.             USAGE
  8367.  
  8368.             SCROLLDN shifts the contents of the box described by (X1, Y1)
  8369.             - (X2, Y2) down by the number of pixels specified by Num.  The
  8370.             empty pixels created at the top of the box are filled with
  8371.             Color.  The pixels that are shifted out of the box are lost.
  8372.             SCROLLDN enforces X2 X1 and Y2Y1.  When placed within a loop,
  8373.             SCROLLDN will create a scrolling effect.
  8374.  
  8375.             SEE ALSO
  8376.  
  8377.             SCROLLLT, SCROLLRT, SCROLLUP
  8378.  
  8379.             EXAMPLE
  8380.  
  8381.             REM SCROLL SOME TEXT DOWN
  8382.             REM $INCLUDE: 'SVGABC.BI'
  8383.             DEFINT A-Z
  8384.  
  8385.             VMODE = VIDEOMODEGET
  8386.             IF WHICHVGA = 0 THEN STOP
  8387.             IF WHICHMEM < 512 THEN STOP
  8388.             DUMMY=RES640
  8389.             DRWBOX 1, 10, 0, 0, 100, 100
  8390.             DRWSTRING 1, 7, 0, "TEXT TEXT", 20, 43
  8391.             FOR I = 0 TO 40
  8392.                SCROLLDN 1, 1, 99, 99, 1, 0
  8393.                SDELAY 2
  8394.             NEXT I
  8395.             WHILE INKEY$ = ""
  8396.             WEND
  8397.             VIDEOMODESET VMODE
  8398.             END
  8399.  
  8400.  
  8401.  
  8402.  
  8403.  
  8404.  
  8405.                                                                         134
  8406.  
  8407.  
  8408.  
  8409.  
  8410.  
  8411.           SCROLLLT
  8412.  
  8413.             PROTOTYPE
  8414.  
  8415.             SUB SCROLLLT (X1%, Y1%, X2%, Y2%, Num%, Color%)
  8416.  
  8417.             INPUT
  8418.  
  8419.             X1, Y1 - top left corner of block
  8420.             X2, Y2 - bottom right corner of block
  8421.             Num - number of pixels to shift
  8422.             Color - index to color in current palette
  8423.  
  8424.             OUTPUT
  8425.  
  8426.             no value returned
  8427.  
  8428.             USAGE
  8429.  
  8430.             SCROLLLT shifts the contents of the box described by (X1, Y1)
  8431.             - (X2, Y2) down by the number of pixels specified by Num.  The
  8432.             empty pixels created at the right of the box are filled with
  8433.             Color.  The pixels that are shifted out of the box are lost.
  8434.             SCROLLLT enforces X2 X1 and Y2Y1.  When placed within a loop,
  8435.             SCROLLRT will create a scrolling effect.
  8436.  
  8437.             SEE ALSO
  8438.  
  8439.             SCROLLDN, SCROLLRT, SCROLLUP
  8440.  
  8441.             EXAMPLE
  8442.  
  8443.             REM SCROLL SOME TEXT LEFT
  8444.             REM $INCLUDE: 'SVGABC.BI'
  8445.             DEFINT A-Z
  8446.  
  8447.             VMODE = VIDEOMODEGET
  8448.             IF WHICHVGA = 0 THEN STOP
  8449.             IF WHICHMEM < 512 THEN STOP
  8450.             DUMMY=RES640
  8451.             DRWBOX 1, 10, 0, 0, 100, 100
  8452.             DRWSTRING 1, 7, 0, "TEXT TEXT", 20, 43
  8453.             FOR I = 0 TO 40
  8454.                SCROLLLT 1, 1, 99, 99, 1, 0
  8455.                SDELAY 2
  8456.             NEXT I
  8457.             WHILE INKEY$ = ""
  8458.             WEND
  8459.             VIDEOMODESET VMODE
  8460.             END
  8461.  
  8462.  
  8463.  
  8464.  
  8465.  
  8466.  
  8467.                                                                         135
  8468.  
  8469.  
  8470.  
  8471.  
  8472.  
  8473.           SCROLLRT
  8474.  
  8475.             PROTOTYPE
  8476.  
  8477.             SUB SCROLLRT (X1%, Y1%, X2%, Y2%, Num%, Color%)
  8478.  
  8479.             INPUT
  8480.  
  8481.             X1, Y1 - top left corner of block
  8482.             X2, Y2 - bottom right corner of block
  8483.             Num - number of pixels to shift
  8484.             Color - index to color in current palette
  8485.  
  8486.             OUTPUT
  8487.  
  8488.             no value returned
  8489.  
  8490.             USAGE
  8491.  
  8492.             SCROLLRT shifts the contents of the box described by (X1, Y1)
  8493.             - (X2, Y2) down by the number of pixels specified by Num.  The
  8494.             empty pixels created at the left of the box are filled with
  8495.             Color.  The pixels that are shifted out of the box are lost.
  8496.             SCROLLRT enforces X2 X1 and Y2Y1.  When placed within a loop,
  8497.             SCROLLRT will create a scrolling effect.
  8498.  
  8499.             SEE ALSO
  8500.  
  8501.             SCROLLDN, SCROLLLT, SCROLLUP
  8502.  
  8503.             EXAMPLE
  8504.  
  8505.             REM SCROLL SOME TEXT RIGHT
  8506.             REM $INCLUDE: 'SVGABC.BI'
  8507.             DEFINT A-Z
  8508.  
  8509.             VMODE = VIDEOMODEGET
  8510.             IF WHICHVGA = 0 THEN STOP
  8511.             IF WHICHMEM < 512 THEN STOP
  8512.             DUMMY=RES640
  8513.             DRWBOX 1, 10, 0, 0, 100, 100
  8514.             DRWSTRING 1, 7, 0, "TEXT TEXT", 20, 43
  8515.             FOR I = 0 TO 40
  8516.                SCROLLRT 1, 1, 99, 99, 1, 0
  8517.                SDELAY 2
  8518.             NEXT I
  8519.             WHILE INKEY$ = ""
  8520.             WEND
  8521.             VIDEOMODESET VMODE
  8522.             END
  8523.  
  8524.  
  8525.  
  8526.  
  8527.  
  8528.  
  8529.                                                                         136
  8530.  
  8531.  
  8532.  
  8533.  
  8534.  
  8535.           SCROLLUP
  8536.  
  8537.             PROTOTYPE
  8538.  
  8539.             SUB SCROLLUP (X1%, Y1%, X2%, Y2%, Num%, Color%)
  8540.  
  8541.             INPUT
  8542.  
  8543.             X1, Y1 - top left corner of block
  8544.             X2, Y2 - bottom right corner of block
  8545.             Num - number of pixels to shift
  8546.             Color - index to color in current palette
  8547.  
  8548.             OUTPUT
  8549.  
  8550.             no value returned
  8551.  
  8552.             USAGE
  8553.  
  8554.             SCROLLUP shifts the contents of the box described by (X1, Y1)
  8555.             - (X2, Y2) down by the number of pixels specified by Num.  The
  8556.             empty pixels created at the bottom of the box are filled with
  8557.             Color.  The pixels that are shifted out of the box are lost.
  8558.             SCROLLUP enforces X2 X1 and Y2Y1.  When placed within a loop,
  8559.             SCROLLUP will create a scrolling effect.
  8560.  
  8561.             SEE ALSO
  8562.  
  8563.             SCROLLDN, SCROLLLT, SCROLLRT
  8564.  
  8565.             EXAMPLE
  8566.  
  8567.             REM SCROLL SOME TEXT UP
  8568.             REM $INCLUDE: 'SVGABC.BI'
  8569.             DEFINT A-Z
  8570.  
  8571.             VMODE = VIDEOMODEGET
  8572.             IF WHICHVGA = 0 THEN STOP
  8573.             IF WHICHMEM < 512 THEN STOP
  8574.             DUMMY=RES640
  8575.             DRWBOX 1, 10, 0, 0, 100, 100
  8576.             DRWSTRING 1, 7, 0, "TEXT TEXT", 20, 43
  8577.             FOR I = 0 TO 40
  8578.                SCROLLUP 1, 1, 99, 99, 1, 0
  8579.                SDELAY 2
  8580.             NEXT I
  8581.             WHILE INKEY$ = ""
  8582.             WEND
  8583.             VIDEOMODESET VMODE
  8584.             END
  8585.  
  8586.  
  8587.  
  8588.  
  8589.  
  8590.  
  8591.                                                                         137
  8592.  
  8593.  
  8594.  
  8595.  
  8596.  
  8597.           SDELAY
  8598.  
  8599.             PROTOTYPE
  8600.  
  8601.             SUB SDELAY (Count%)
  8602.  
  8603.             INPUT
  8604.  
  8605.             Count - number of vertical syncs to wait
  8606.  
  8607.             OUTPUT
  8608.  
  8609.             no value returned
  8610.  
  8611.             USAGE
  8612.  
  8613.             SDELAY pauses execution of the program for a period of time
  8614.             specified by Count.  This delay remains approximately constant
  8615.             on all machines by using the vertical sync timer of the VGA
  8616.             graphics card which is about 60 - 70 Hz.
  8617.  
  8618.             EXAMPLE
  8619.  
  8620.             REM MAKE A DELAY ABOUT 3 SECONDS LONG
  8621.             REM $INCLUDE: 'SVGABC.BI'
  8622.             DEFINT A-Z
  8623.  
  8624.             CLS
  8625.             PRINT "OK...STARTING DELAY NOW..."
  8626.             PRINT "SHOULD BE ABOUT 3 SECONDS..."
  8627.             PRINT
  8628.             TIM! = TIMER
  8629.             SDELAY 195
  8630.             TOT! = TIMER - TIM!
  8631.             PRINT "ACTUAL TIME WAS:"; TOT!
  8632.             WHILE INKEY$ = ""
  8633.             WEND
  8634.             END
  8635.  
  8636.  
  8637.  
  8638.  
  8639.  
  8640.  
  8641.  
  8642.  
  8643.  
  8644.  
  8645.  
  8646.  
  8647.  
  8648.  
  8649.  
  8650.  
  8651.  
  8652.  
  8653.                                                                         138
  8654.  
  8655.  
  8656.  
  8657.  
  8658.  
  8659.           SETCARD
  8660.  
  8661.             PROTOTYPE
  8662.  
  8663.             SUB SETCARD (Chip%, Mem%)
  8664.  
  8665.             INPUT
  8666.  
  8667.             Chip - code for certain SVGA chip type
  8668.             Mem - amount of video memory installed
  8669.  
  8670.             OUTPUT
  8671.  
  8672.             no value returned
  8673.  
  8674.             USAGE
  8675.  
  8676.             WARNING:  USING SETCARD IMPROPERLY MAY CAUSE A SYSTEM FAILURE
  8677.             OR DAMAGE.
  8678.             SETCARD sets the card type and installed video memory.  It can
  8679.             be used instead of the WHICHVGA function.  However, specifying
  8680.             an incorrect chip type or installed video memory may cause
  8681.             unpredictable results not excluding damage to the SVGA card
  8682.             and/or monitor.  Extreme caution is advised when using this
  8683.             function.  It is recommended that this function only be used
  8684.             when it is suspected that the identification process in
  8685.             WHICHVGA failed.  Be absolutely certain that the chip type
  8686.             specified is the actual chip type installed in the computer.
  8687.             Mem should be a value of 256, 512, 1024  or 2048 representing
  8688.             the kilobytes of video memory installed.  Use the following
  8689.             table to identify chip types:
  8690.  
  8691.           1  Acumos AVGA2/3 SuperVGA
  8692.           2  ATI Technologies 18/28/38/68800
  8693.              SuperVGA
  8694.           3  Ahead V5000 ver A SuperVGA
  8695.           4  Ahead V5000 ver B SuperVGA
  8696.           5  Chips and Technologies 82C45x SuperVGA
  8697.           6  Cirrus Logic CL-GD 5xx, 6xx, 28xx,
  8698.              54xx, 62xx SuperVGA
  8699.           7  Everex Micro Enhancer Ev236/6xx
  8700.              SuperVGA
  8701.           8  Genoa 61/62/63/64/6600 SuperVGA
  8702.           9  NCR 77C21/22/22E/22E+ SuperVGA
  8703.           10 Oak Technologies OTI-037C/067/077/087
  8704.              SuperVGA
  8705.           11 Paradise/Western Digital PVGA1A,
  8706.              WD90C00/1x/2x/3x SuperVGA
  8707.           12 Realtek RT3106 SuperVGA
  8708.           13 Trident 8800CS, 8900B/C/CL/CX, 90x0
  8709.              SuperVGA
  8710.           14 Tseng Labs ET3000-AX/BX/BP SuperVGA
  8711.           15 Tseng Labs ET4000/W32/W32I SuperVGA
  8712.           16 VESA compatible SuperVGA
  8713.  
  8714.  
  8715.                                                                         139
  8716.  
  8717.  
  8718.  
  8719.  
  8720.  
  8721.           17 Video 7 HT-208/16 SuperVGA
  8722.           18 Avance Logic AL2101 SuperVGA
  8723.           19 MXIC MX68000/10 SuperVGA
  8724.           20 Primus P2000 SuperVGA
  8725.  
  8726.             SEE ALSO
  8727.  
  8728.             WHICHVGA
  8729.  
  8730.             EXAMPLE
  8731.  
  8732.             REM
  8733.             !WARNING!WARNING!WARNING!WARNING!WARNING!WARNING!WARNING!WARNI
  8734.             NG!
  8735.  
  8736.             REM USE THIS FUNCTION CAREFULLY. IT WORKS AROUND THE "WHICHVGA
  8737.             FUNCTION"
  8738.             REM IMPROPER USE (I.E. SETTING THE CARD ID AND MEMORY TO
  8739.             SOMETHING THAT
  8740.             REM THAT IS NOT VALID) MIGHT DAMAGE YOUR VIDEO CARD/VIDEO
  8741.             MONITOR OR
  8742.             REM CAUSE UNPREDICTABLE RESULTS. IT IS PROVIDED AS A METHOD TO
  8743.             FIND
  8744.             REM FAULTS IN THE VIDEO CARD/CHIP ID PROCESS.
  8745.  
  8746.             REM
  8747.             !WARNING!WARNING!WARNING!WARNING!WARNING!WARNING!WARNING!WARNI
  8748.             NG!
  8749.  
  8750.             END
  8751.  
  8752.  
  8753.  
  8754.  
  8755.  
  8756.  
  8757.  
  8758.  
  8759.  
  8760.  
  8761.  
  8762.  
  8763.  
  8764.  
  8765.  
  8766.  
  8767.  
  8768.  
  8769.  
  8770.  
  8771.  
  8772.  
  8773.  
  8774.  
  8775.  
  8776.  
  8777.                                                                         140
  8778.  
  8779.  
  8780.  
  8781.  
  8782.  
  8783.           SETVIEW
  8784.  
  8785.             PROTOTYPE
  8786.  
  8787.             SUB SETVIEW (X1%, Y1%, X2%, Y2%)
  8788.  
  8789.             INPUT
  8790.  
  8791.             X1, Y1 - top, left corner of view port
  8792.             X2, Y2 - bottom, right corner of view port
  8793.  
  8794.             OUTPUT
  8795.  
  8796.             no value returned
  8797.  
  8798.             USAGE
  8799.  
  8800.             SETVIEW defines a viewport for clipping output on the screen.
  8801.             Nothing can be drawn outside of the currently defined
  8802.             viewport.  The RES### functions set the viewport to the full
  8803.             screen.  The restrictions on X1, Y1, X2 and Y2 are as follows:
  8804.  
  8805.             0   X1 < X2  (screen width)
  8806.             0   Y1 < Y2  (32767, effectively unbounded)
  8807.  
  8808.             SEE ALSO
  8809.  
  8810.             RES320, RES640, RES640L, RES800, RES1024, RES1280
  8811.  
  8812.             EXAMPLE
  8813.  
  8814.             REM DRAW SOME LINES CLIPPED TO A VIEWPORT
  8815.             REM $INCLUDE: 'SVGABC.BI'
  8816.             DEFINT A-Z
  8817.  
  8818.             VMODE = VIDEOMODEGET
  8819.             IF WHICHVGA = 0 THEN STOP
  8820.             IF WHICHMEM < 512 THEN STOP
  8821.             DUMMY=RES640
  8822.             DRWBOX 1, 15, 100, 100, 539, 379
  8823.             SETVIEW 101, 101, 538, 378
  8824.             FOR I = 0 TO 300
  8825.                X1 = RND * 640
  8826.                Y1 = RND * 480
  8827.                X2 = RND * 640
  8828.                Y2 = RND * 480
  8829.                DRWLINE 1, 10, X1, Y1, X2, Y2
  8830.             NEXT I
  8831.             WHILE INKEY$ = ""
  8832.             WEND
  8833.             VIDEOMODESET VMODE
  8834.             END
  8835.  
  8836.  
  8837.  
  8838.  
  8839.                                                                         141
  8840.  
  8841.  
  8842.  
  8843.  
  8844.  
  8845.           SPRITECOLLDETECT
  8846.  
  8847.             PROTOTYPE
  8848.  
  8849.             FUNCTION SPRITECOLLDETECT% (TransColor%, X1%, Y1%, X2%, Y2%,
  8850.             GfxBlk1%, GfxBlk2%)
  8851.  
  8852.             INPUT
  8853.  
  8854.             TransColor - index to color in current palette
  8855.             X1, Y1 - top, left corner of sprite number 1
  8856.             X2, Y2 - top, left corner of sprite number 2
  8857.             GfxBlk1 - predefined integer array containing the sprite
  8858.             number 1
  8859.             GfxBlk2 - predefined integer array containing the sprite
  8860.             number 2
  8861.  
  8862.             OUTPUT
  8863.  
  8864.             SPRITECOLLDETECT returns the collision status of the two
  8865.             sprites.
  8866.  
  8867.             USAGE
  8868.  
  8869.             SPRITECOLLDETECT is used in sprite graphics or animation to
  8870.             report the collision status between two sprites.  GfxBlk1, a
  8871.             short integer array, contains the first sprite which should
  8872.             have been previously defined by BLKGET or similar function.
  8873.             GfxBlk2, likewise, contains the second sprite.  The top, left
  8874.             corner of the first and second sprites' locations are
  8875.             specified by X1, Y1 and X2, Y2, respectively.
  8876.  
  8877.             SPRITECOLLDETECT will return a zero if the sprites are not
  8878.             colliding and the blocks are not overlapping.  The return will
  8879.             be one if the blocks overlap, but the sprites are not
  8880.             colliding.  A return value of two indicates that the sprites
  8881.             have at least one overlapping pixel and are, therefore,
  8882.             colliding.
  8883.  
  8884.             Arrays should be passed by giving the element within the array
  8885.             from where the action should take place.  This allows the
  8886.             programmer to store more than one item within the same array
  8887.             or act on only a portion of the array.
  8888.  
  8889.             SEE ALSO
  8890.  
  8891.             BLKGET, BLKPUT, GETLASTSTRING, SPRITEGAP, SPRITEGET, SPRITEPUT
  8892.  
  8893.             EXAMPLE
  8894.  
  8895.             REM SHOW THE RESULTS OF THE SPRITE COLLISION DETECTION
  8896.             FUNCTION
  8897.             REM $INCLUDE: 'SVGABC.BI'
  8898.  
  8899.  
  8900.  
  8901.                                                                         142
  8902.  
  8903.  
  8904.  
  8905.  
  8906.  
  8907.             DEFINT A-Z
  8908.  
  8909.             DIM D1(0 TO 4000) AS INTEGER
  8910.             DIM D2(0 TO 4000) AS INTEGER
  8911.  
  8912.             IF WHICHVGA < 0 THEN STOP
  8913.             ORGMODE = VIDEOMODEGET
  8914.             DUMMY=RES320
  8915.             X1 = 0
  8916.             Y1 = 0
  8917.             X2 = 24
  8918.             Y2 = 24
  8919.             DRWLINE 1, 8, X1, Y1, X2, Y1
  8920.             DRWLINE 1, 8, X2, Y1, X2, Y2
  8921.             DRWLINE 1, 8, X2, Y2, X1, Y2
  8922.             DRWLINE 1, 8, X1, Y2, X1, Y1
  8923.             FILLAREA X1 + 1, Y1 + 1, 8, 8
  8924.             DRWLINE 1, 10, X1, Y1, X2, Y2
  8925.             DRWLINE 1, 10, X2, Y1, X1, Y2
  8926.             BLKGET X1, Y1, X2, Y2, D1(0)
  8927.             BLKPUT 2, X1, Y1, D1(0)
  8928.             X1 = 0
  8929.             Y1 = 0
  8930.             X2 = 48
  8931.             Y2 = 48
  8932.             DRWLINE 1, 8, X1, Y1, X2, Y1
  8933.             DRWLINE 1, 8, X2, Y1, X2, Y2
  8934.             DRWLINE 1, 8, X2, Y2, X1, Y2
  8935.             DRWLINE 1, 8, X1, Y2, X1, Y1
  8936.             FILLAREA X1 + 1, Y1 + 1, 8, 8
  8937.             DRWCIRCLE 1, 10, X1 + 24, Y1 + 24, 24
  8938.             BLKGET X1, Y1, X2, Y2, D2(0)
  8939.             BLKPUT 2, X1, Y1, D2(0)
  8940.             X1 = 90
  8941.             Y1 = 90
  8942.             BLKPUT 2, X1, Y1, D2(0)
  8943.             FOR X = 50 TO 150
  8944.                BLKPUT 2, X, X, D1(0)
  8945.                A = SPRITECOLLDETECT(8, X, X, X1, Y1, D1(0), D2(0))
  8946.                A$ = STR$(A)
  8947.                IF LEN(A$) < 5 THEN A$ = A$ + " "
  8948.                DRWSTRING 1, 7, 0, A$, 0, 0
  8949.                WHILE INKEY$ = ""
  8950.                WEND
  8951.                BLKPUT 2, X, X, D1(0)
  8952.             NEXT X
  8953.             VIDEOMODESET ORGMODE
  8954.             END
  8955.  
  8956.  
  8957.  
  8958.  
  8959.  
  8960.  
  8961.  
  8962.  
  8963.                                                                         143
  8964.  
  8965.  
  8966.  
  8967.  
  8968.  
  8969.           SPRITEGAP
  8970.  
  8971.             PROTOTYPE
  8972.  
  8973.             SUB SPRITEGAP (TransColor%, X%, Y%, GfxBlk%, BkGndGfxBlk%)
  8974.  
  8975.             INPUT
  8976.  
  8977.             TransColor - index to color in current palette
  8978.             X, Y - top, left corner of block
  8979.             GfxBlk - predefined integer array containing the sprite
  8980.  
  8981.             OUTPUT
  8982.  
  8983.             no value returned
  8984.             BkGndGfxBlk - integer array holding the sprite background
  8985.  
  8986.             USAGE
  8987.  
  8988.             SPRITEGAP ("Sprite-Get-And-Put") is used in sprite graphics or
  8989.             animation to retrieve a sprite's background and then display
  8990.             the sprite.  GfxBlk, a short integer array, contains the
  8991.             sprite which should have been previously defined by BLKGET or
  8992.             similar function such as GETLASTSTRING.  TransColor is the
  8993.             transparent color assumed in GfxBlk.  BkGndGfxBlk, an empty
  8994.             short integer array the same size as GfxBlk, will receive the
  8995.             sprite's background.  The top, left corner of the sprite's
  8996.             location is specified by X, Y.
  8997.  
  8998.             Arrays should be passed by giving the element within the array
  8999.             from where the action should take place.  This allows the
  9000.             programmer to store more than one item within the same array
  9001.             or act on only a portion of the array.
  9002.  
  9003.             SEE ALSO
  9004.  
  9005.             BLKGET, BLKPUT, GETLASTSTRING, SPRITECOLLDETECT, SPRITEGET,
  9006.             SPRITEPUT
  9007.  
  9008.             EXAMPLE
  9009.  
  9010.             REM SHOW SPRITEGAP
  9011.             REM $INCLUDE: 'SVGABC.BI'
  9012.             DEFINT A-Z
  9013.             DIM GFXBLK1(10000)
  9014.             DIM GFXBLK2(10000)
  9015.             DIM GFXBLK3(10000)
  9016.  
  9017.             IF WHICHVGA = 0 THEN STOP
  9018.             VMODE = VIDEOMODEGET
  9019.             IF RES640 <> 1 THEN
  9020.                VIDEOMODESET VMODE
  9021.                END
  9022.             END IF
  9023.  
  9024.  
  9025.                                                                         144
  9026.  
  9027.  
  9028.  
  9029.  
  9030.  
  9031.             Colr = 1
  9032.             FOR I = 0 TO GETMAXX \ 2
  9033.                DRWCIRCLE 1, Colr, GETMAXX \ 4 + I, GETMAXY \ 2, GETMAXY \ 5
  9034.                Colr = Colr + 1
  9035.                IF Colr > 15 THEN
  9036.                  Colr = 1
  9037.                END IF
  9038.             NEXT I
  9039.             XINC = GETMAXX \ 20
  9040.             YINC = GETMAXY \ 20
  9041.             X1 = GETMAXX \ 2 - XINC
  9042.             Y1 = GETMAXY \ 2 - YINC
  9043.             X2 = GETMAXX \ 2 + XINC
  9044.             Y2 = GETMAXY \ 2 + YINC
  9045.             X = (X2 - X1) \ 2 + X1
  9046.             Y = (Y2 - Y1) \ 2 + Y1
  9047.             BLKGET X1, Y1, X2, Y2, GFXBLK1(0)
  9048.             DRWBOX 1, 0, X1, Y1, X2, Y2
  9049.             FILLAREA X1 + 2, Y1 + 2, 0, 0
  9050.             BLKGET X1, Y1, X2, Y2, GFXBLK3(0)
  9051.             FOR I = 0 TO 360 STEP 3
  9052.                DUMMY = BLKROTATE(I, 1, GFXBLK1(0), GFXBLK2(0))
  9053.                SPRITEPUT 1, 1, X - GFXBLK3(0) \ 2, Y - GFXBLK3(1) \ 2,
  9054.             GFXBLK3(0)
  9055.                SPRITEGAP 1, X - GFXBLK2(0) \ 2, Y - GFXBLK2(1) \ 2,
  9056.             GFXBLK2(0), GFXBLK3(0)
  9057.                SDELAY 3
  9058.             NEXT I
  9059.             SPRITEPUT 1, 1, X - GFXBLK3(0) \ 2, Y - GFXBLK3(1) \ 2,
  9060.             GFXBLK3(0)
  9061.             BLKPUT 1, X1, Y1, GFXBLK1(0)
  9062.             VIDEOMODESET VMODE
  9063.             END
  9064.  
  9065.  
  9066.  
  9067.  
  9068.  
  9069.  
  9070.  
  9071.  
  9072.  
  9073.  
  9074.  
  9075.  
  9076.  
  9077.  
  9078.  
  9079.  
  9080.  
  9081.  
  9082.  
  9083.  
  9084.  
  9085.  
  9086.  
  9087.                                                                         145
  9088.  
  9089.  
  9090.  
  9091.  
  9092.  
  9093.           SPRITEGET
  9094.  
  9095.             PROTOTYPE
  9096.  
  9097.             SUB SPRITEGET (TransColor%, X%, Y%, GfxBlk%, BkGndGfxBlk%)
  9098.  
  9099.             INPUT
  9100.  
  9101.             TransColor - index to color in current palette
  9102.             X, Y - top, left corner of block
  9103.             GfxBlk - predefined integer array containing the sprite
  9104.  
  9105.             OUTPUT
  9106.  
  9107.             no value returned
  9108.             BkGndGfxBlk - integer array holding the sprite background
  9109.  
  9110.             USAGE
  9111.  
  9112.             SPRITEGET is used in sprite graphics or animation to retrieve
  9113.             the background for a sprite, normally just before using
  9114.             SPRITEPUT.  GfxBlk, a short integer array, contains the sprite
  9115.             which should have been previously defined by BLKGET or similar
  9116.             function.  TransColor is the transparent color assumed in
  9117.             GfxBlk.  BkGndGfxBlk, an empty short integer array of the same
  9118.             size as GfxBlk, will receive the sprite's background.  The
  9119.             top, left corner of the sprite's location is specified by X,
  9120.             Y.
  9121.  
  9122.             Arrays should be passed by giving the element within the array
  9123.             from where the action should take place.  This allows the
  9124.             programmer to store more than one item within the same array
  9125.             or act on only a portion of the array.
  9126.  
  9127.             SEE ALSO
  9128.  
  9129.             BLKGET, BLKPUT, GETLASTSTRING, SPRITECOLLDETECT, SPRITEGAP,
  9130.             SPRITEPUT
  9131.  
  9132.             EXAMPLE
  9133.  
  9134.             REM SHOW SPRITEGET
  9135.             REM $INCLUDE: 'SVGABC.BI'
  9136.             DEFINT A-Z
  9137.             DIM GFXBLK1(10000)
  9138.             DIM GFXBLK2(10000)
  9139.             DIM GFXBLK3(10000)
  9140.  
  9141.             IF WHICHVGA = 0 THEN STOP
  9142.             VMODE = VIDEOMODEGET
  9143.             IF RES640 <> 1 THEN
  9144.                VIDEOMODESET VMODE
  9145.                END
  9146.             END IF
  9147.  
  9148.  
  9149.                                                                         146
  9150.  
  9151.  
  9152.  
  9153.  
  9154.  
  9155.             Colr = 1
  9156.             FOR I = 0 TO GETMAXX \ 2
  9157.                DRWCIRCLE 1, Colr, GETMAXX \ 4 + I, GETMAXY \ 2, GETMAXY \ 5
  9158.                Colr = Colr + 1
  9159.                IF Colr > 15 THEN
  9160.                  Colr = 1
  9161.                END IF
  9162.             NEXT I
  9163.             XINC = GETMAXX \ 20
  9164.             YINC = GETMAXY \ 20
  9165.             X1 = GETMAXX \ 2 - XINC
  9166.             Y1 = GETMAXY \ 2 - YINC
  9167.             X2 = GETMAXX \ 2 + XINC
  9168.             Y2 = GETMAXY \ 2 + YINC
  9169.             X = (X2 - X1) \ 2 + X1
  9170.             Y = (Y2 - Y1) \ 2 + Y1
  9171.             BLKGET X1, Y1, X2, Y2, GFXBLK1(0)
  9172.             DRWBOX 1, 0, X1, Y1, X2, Y2
  9173.             FILLAREA X1 + 2, Y1 + 2, 0, 0
  9174.             BLKGET X1, Y1, X2, Y2, GFXBLK3(0)
  9175.             FOR I = 0 TO 360 STEP 3
  9176.                DUMMY = BLKROTATE(I, 1, GFXBLK1(0), GFXBLK2(0))
  9177.                SPRITEPUT 1, 1, X - GFXBLK3(0) \ 2, Y - GFXBLK3(1) \ 2,
  9178.             GFXBLK3(0)
  9179.                SPRITEGET 1, X - GFXBLK2(0) \ 2, Y - GFXBLK2(1) \ 2,
  9180.             GFXBLK2(0), GFXBLK3(0)
  9181.                SPRITEPUT 1, 1, X - GFXBLK2(0) \ 2, Y - GFXBLK2(1) \ 2,
  9182.             GFXBLK2(0)
  9183.                SDELAY 3
  9184.             NEXT I
  9185.             SPRITEPUT 1, 1, X - GFXBLK3(0) \ 2, Y - GFXBLK3(1) \ 2,
  9186.             GFXBLK3(0)
  9187.             BLKPUT 1, X1, Y1, GFXBLK1(0)
  9188.             VIDEOMODESET VMODE
  9189.             END
  9190.  
  9191.  
  9192.  
  9193.  
  9194.  
  9195.  
  9196.  
  9197.  
  9198.  
  9199.  
  9200.  
  9201.  
  9202.  
  9203.  
  9204.  
  9205.  
  9206.  
  9207.  
  9208.  
  9209.  
  9210.  
  9211.                                                                         147
  9212.  
  9213.  
  9214.  
  9215.  
  9216.  
  9217.           SPRITEPUT
  9218.  
  9219.             PROTOTYPE
  9220.  
  9221.             SUB SPRITEPUT (Mode%, TransColor%, X%, Y%, GfxBlk%)
  9222.  
  9223.             INPUT
  9224.  
  9225.             Mode - pixel write mode (SET=1, XOR=2, OR=3, AND=4)
  9226.             TransColor - index to color in current palette
  9227.             X, Y - top, left corner of block
  9228.             GfxBlk - predefined integer array containing the sprite
  9229.  
  9230.             OUTPUT
  9231.  
  9232.             no value returned
  9233.  
  9234.             USAGE
  9235.  
  9236.             SPRITEPUT is used in sprite graphics or animation to display a
  9237.             sprite or, more commonly, its background.  GfxBlk, a short
  9238.             integer array, contains the sprite which should have been
  9239.             previously defined by BLKGET,  SPRITEGAP or SPRITEGET.
  9240.             TransColor is the transparent color assumed in GfxBlk.  The
  9241.             top, left corner of the sprite's location is specified by X,
  9242.             Y.
  9243.  
  9244.             Arrays should be passed by giving the element within the array
  9245.             from where the action should take place.  This allows the
  9246.             programmer to store more than one item within the same array
  9247.             or act on only a portion of the array.
  9248.  
  9249.             SEE ALSO
  9250.  
  9251.             BLKGET, BLKPUT, GETLASTSTRING, SPRITECOLLDETECT, SPRITEGAP,
  9252.             SPRITEGET
  9253.  
  9254.             EXAMPLE
  9255.  
  9256.             See SPRITEGAP
  9257.  
  9258.  
  9259.  
  9260.  
  9261.  
  9262.  
  9263.  
  9264.  
  9265.  
  9266.  
  9267.  
  9268.  
  9269.  
  9270.  
  9271.  
  9272.  
  9273.                                                                         148
  9274.  
  9275.  
  9276.  
  9277.  
  9278.  
  9279.           VIDEOMODEGET
  9280.  
  9281.             PROTOTYPE
  9282.  
  9283.             FUNCTION VIDEOMODEGET% ()
  9284.  
  9285.             INPUT
  9286.  
  9287.             no input parameters
  9288.  
  9289.             OUTPUT
  9290.  
  9291.             VIDEOMODEGET returns the current video mode.
  9292.  
  9293.             USAGE
  9294.  
  9295.             VIDEOMODEGET returns the current video mode.  This function is
  9296.             best used to retrieve the video mode being used when a program
  9297.             begins.  When the program ends, this video mode can then be
  9298.             restored using VIDEOMODESET.
  9299.  
  9300.             SEE ALSO
  9301.  
  9302.             RES320, RES640, RES640L, RES800, RES1024, RES1280, RESTEXT,
  9303.             VIDEOMODESET
  9304.  
  9305.             EXAMPLE
  9306.  
  9307.             REM SAVE THE VIDEO MODE,SWITCH TO 640X480X256, RESTORE THE
  9308.             ORIGINAL MODE
  9309.             REM $INCLUDE: 'SVGABC.BI'
  9310.             DEFINT A-Z
  9311.  
  9312.             VMODE = VIDEOMODEGET
  9313.             IF WHICHVGA = 0 THEN STOP
  9314.             IF WHICHMEM < 512 THEN STOP
  9315.             DUMMY=RES640
  9316.             DRWSTRING 1, 7, 0, "PRESS A KEY...", 0, 0
  9317.             WHILE INKEY$ = ""
  9318.             WEND
  9319.             VIDEOMODESET VMODE
  9320.             END
  9321.  
  9322.  
  9323.  
  9324.  
  9325.  
  9326.  
  9327.  
  9328.  
  9329.  
  9330.  
  9331.  
  9332.  
  9333.  
  9334.  
  9335.                                                                         149
  9336.  
  9337.  
  9338.  
  9339.  
  9340.  
  9341.           VIDEOMODESET
  9342.  
  9343.             PROTOTYPE
  9344.  
  9345.             SUB VIDEOMODESET (Mode%)
  9346.  
  9347.             INPUT
  9348.  
  9349.             Mode - number of video mode
  9350.  
  9351.             OUTPUT
  9352.  
  9353.             no value returned
  9354.  
  9355.             USAGE
  9356.  
  9357.             VIDEOMODESET sets the video mode specified by Mode.  This
  9358.             function is best used at the end of a program to restore the
  9359.             video mode to the mode in use when the program began.  The
  9360.             program should retrieve the video mode at the beginning by
  9361.             using VIDEOMODEGET.
  9362.  
  9363.             SEE ALSO
  9364.  
  9365.             RES320, RES640, RES640L, RES800, RES1024, RES1280, RESTEXT,
  9366.             VIDEOMODEGET
  9367.  
  9368.             EXAMPLE
  9369.  
  9370.             See VIDEOMODEGET
  9371.  
  9372.  
  9373.  
  9374.  
  9375.  
  9376.  
  9377.  
  9378.  
  9379.  
  9380.  
  9381.  
  9382.  
  9383.  
  9384.  
  9385.  
  9386.  
  9387.  
  9388.  
  9389.  
  9390.  
  9391.  
  9392.  
  9393.  
  9394.  
  9395.  
  9396.  
  9397.                                                                         150
  9398.  
  9399.  
  9400.  
  9401.  
  9402.  
  9403.           VIDEOOFF
  9404.  
  9405.             PROTOTYPE
  9406.  
  9407.             SUB VIDEOOFF ()
  9408.  
  9409.             INPUT
  9410.  
  9411.             no input parameters
  9412.  
  9413.             OUTPUT
  9414.  
  9415.             no value returned
  9416.  
  9417.             USAGE
  9418.  
  9419.             VIDEOOFF turns the output display off.  Graphics may still be
  9420.             drawn to the screen.  However, the computer's monitor will
  9421.             display nothing and appear black.  This function can be used
  9422.             to hide graphics being drawn by initially using VIDEOOFF and
  9423.             then later calling VIDEOON.
  9424.  
  9425.             SEE ALSO
  9426.  
  9427.             VIDEOON
  9428.  
  9429.             EXAMPLE
  9430.  
  9431.             REM DISABLE THE VIDEO FOR ABOUT 3 SEC
  9432.             REM $INCLUDE: 'SVGABC.BI'
  9433.             DEFINT A-Z
  9434.  
  9435.             CLS
  9436.             PRINT "PRESS A KEY TO DISABLE THE VIDEO DISPLAY FOR 3 SECONDS"
  9437.             WHILE INKEY$ = ""
  9438.             WEND
  9439.             VIDEOOFF
  9440.             SDELAY 195
  9441.             VIDEOON
  9442.             PRINT "OK...WE ARE BACK!"
  9443.             WHILE INKEY$ = ""
  9444.             WEND
  9445.             END
  9446.  
  9447.  
  9448.  
  9449.  
  9450.  
  9451.  
  9452.  
  9453.  
  9454.  
  9455.  
  9456.  
  9457.  
  9458.  
  9459.                                                                         151
  9460.  
  9461.  
  9462.  
  9463.  
  9464.  
  9465.           VIDEOON
  9466.  
  9467.             PROTOTYPE
  9468.  
  9469.             SUB VIDEOON ()
  9470.  
  9471.             INPUT
  9472.  
  9473.             no input parameters
  9474.  
  9475.             OUTPUT
  9476.  
  9477.             no value returned
  9478.  
  9479.             USAGE
  9480.  
  9481.             VIDEOON turns the display back on.  All graphics that were
  9482.             drawn while the display was off are now visible.  This
  9483.             function can be used to hide graphics being drawn by initially
  9484.             using VIDEOOFF and then later calling VIDEOON.
  9485.  
  9486.             SEE ALSO
  9487.  
  9488.             VIDEOOFF
  9489.  
  9490.             EXAMPLE
  9491.  
  9492.             See VIDEOOFF
  9493.  
  9494.  
  9495.  
  9496.  
  9497.  
  9498.  
  9499.  
  9500.  
  9501.  
  9502.  
  9503.  
  9504.  
  9505.  
  9506.  
  9507.  
  9508.  
  9509.  
  9510.  
  9511.  
  9512.  
  9513.  
  9514.  
  9515.  
  9516.  
  9517.  
  9518.  
  9519.  
  9520.  
  9521.                                                                         152
  9522.  
  9523.  
  9524.  
  9525.  
  9526.  
  9527.           WHICHCPU
  9528.  
  9529.             PROTOTYPE
  9530.  
  9531.             FUNCTION WHICHCPU% ()
  9532.  
  9533.             INPUT
  9534.  
  9535.             no input parameters
  9536.  
  9537.             OUTPUT
  9538.  
  9539.             WHICHCPU returns the processor type.
  9540.  
  9541.             USAGE
  9542.  
  9543.             WHICHCPU returns the computer's processor type as 86, 286,
  9544.             386, 486 or 586.  This function should be called by any
  9545.             program using this library's routines to insure that the
  9546.             computer is at least 386 compatible or better.
  9547.  
  9548.             SEE ALSO
  9549.  
  9550.             WHICHJOYSTICK, WHICHMOUSE, WHICHVGA
  9551.  
  9552.             EXAMPLE
  9553.  
  9554.             REM FIND OUT WHAT KIND OF MICROPROCESSOR WE HAVE
  9555.             REM $INCLUDE: 'SVGABC.BI'
  9556.             DEFINT A-Z
  9557.  
  9558.             CLS
  9559.             CPU = WHICHCPU
  9560.             CPU$ = STR$(CPU)
  9561.             L = LEN(CPU$)
  9562.             CPU$ = RIGHT$(CPU$, L - 1)
  9563.             PRINT "Microprocessor is identified as a 80"; CPU$; "."
  9564.             END
  9565.  
  9566.  
  9567.  
  9568.  
  9569.  
  9570.  
  9571.  
  9572.  
  9573.  
  9574.  
  9575.  
  9576.  
  9577.  
  9578.  
  9579.  
  9580.  
  9581.  
  9582.  
  9583.                                                                         153
  9584.  
  9585.  
  9586.  
  9587.  
  9588.  
  9589.           WHICHJOYSTICK
  9590.  
  9591.             PROTOTYPE
  9592.  
  9593.             FUNCTION WHICHJOYSTICK% ()
  9594.  
  9595.             INPUT
  9596.  
  9597.             no input parameters
  9598.  
  9599.             OUTPUT
  9600.  
  9601.             WHICHJOYSTICK returns the available joystick support.
  9602.  
  9603.             USAGE
  9604.  
  9605.             WHICHJOYSTICK returns the joystick support available on the
  9606.             computer.  This function should be called prior to use of the
  9607.             joysticks to verify that joysticks are available.  If the
  9608.             function returns a -1, there is no joystick port present or no
  9609.             BIOS support for a joystick.  Joystick A is bit 1 and B is bit
  9610.             2.  Therefore, a return value of 1 means joystick A is
  9611.             available, a value of 2 means B is available and a value of 3
  9612.             means both are available.  If no bits are set, there are no
  9613.             joysticks present.
  9614.  
  9615.             SEE ALSO
  9616.  
  9617.             JOYSTICKINFO, WHICHCPU, WHICHMOUSE, WHICHVGA
  9618.  
  9619.             EXAMPLE
  9620.  
  9621.             REM FIND OUT IF WE HAVE ANY JOYSTICKS AVAILABLE
  9622.             REM $INCLUDE: 'SVGABC.BI'
  9623.             DEFINT A-Z
  9624.  
  9625.             CLS
  9626.             JOYSTICK = WHICHJOYSTICK
  9627.             SELECT CASE JOYSTICK
  9628.                CASE IS = -1
  9629.                  A$ = "No joystick port detected or no joystick BIOS
  9630.             support present."
  9631.                CASE IS = 0
  9632.                  A$ = "No joystick detected."
  9633.                CASE IS = 1
  9634.                  A$ = "Joystick A is present and available."
  9635.                CASE IS = 2
  9636.                  A$ = "Joystick B is present and available."
  9637.                CASE IS = 3
  9638.                  A$ = "Both Joystick A and Joystick B are present and
  9639.             available."
  9640.             END SELECT
  9641.             PRINT A$
  9642.             END
  9643.  
  9644.  
  9645.                                                                         154
  9646.  
  9647.  
  9648.  
  9649.  
  9650.  
  9651.           WHICHMEM
  9652.  
  9653.             PROTOTYPE
  9654.  
  9655.             FUNCTION WHICHMEM% ()
  9656.  
  9657.             INPUT
  9658.  
  9659.             no input parameters
  9660.  
  9661.             OUTPUT
  9662.  
  9663.             WHICHMEM returns the installed video memory in kilobytes.
  9664.  
  9665.             USAGE
  9666.  
  9667.             WHICHMEM returns the amount of installed video memory as
  9668.             previously determined by WHICHVGA.  WHICHVGA should be called
  9669.             prior to WHICHMEM.  This function should be called prior to
  9670.             any of the RES### functions to verify that there is enough
  9671.             memory to support the resolution.  If SETCARD was used to set
  9672.             the video card and memory, WHICHMEM will return the amount of
  9673.             memory as defined by SETCARD.
  9674.  
  9675.             SEE ALSO
  9676.  
  9677.             RES320, RES640, RES640L, RES800, RES1024, RES1280, SETCARD,
  9678.             WHICHVGA
  9679.  
  9680.             EXAMPLE
  9681.  
  9682.             REM FIND OUT HOW MUCH VIDEO MEMORY WE HAVE
  9683.             REM $INCLUDE: 'SVGABC.BI'
  9684.             DEFINT A-Z
  9685.  
  9686.             CLS
  9687.             DUMMY = WHICHVGA
  9688.             PRINT "INSTALLED VIDEO MEMORY IS IDENTIFIED AS"; WHICHMEM; "k
  9689.             BYTES"
  9690.             END
  9691.  
  9692.  
  9693.  
  9694.  
  9695.  
  9696.  
  9697.  
  9698.  
  9699.  
  9700.  
  9701.  
  9702.  
  9703.  
  9704.  
  9705.  
  9706.  
  9707.                                                                         155
  9708.  
  9709.  
  9710.  
  9711.  
  9712.  
  9713.           WHICHMOUSE
  9714.  
  9715.             PROTOTYPE
  9716.  
  9717.             FUNCTION WHICHMOUSE% ()
  9718.  
  9719.             INPUT
  9720.  
  9721.             no input parameters
  9722.  
  9723.             OUTPUT
  9724.  
  9725.             WHICHMOUSE returns the number of buttons on mouse.
  9726.  
  9727.             USAGE
  9728.  
  9729.             WHICHMOUSE returns a value indicating whether a Microsoft
  9730.             compatible mouse is available.  If the function returns 0, no
  9731.             mouse is available.  A non zero value indicates a mouse and
  9732.             Microsoft compatible driver are installed and gives the number
  9733.             of buttons available.
  9734.  
  9735.             SEE ALSO
  9736.  
  9737.             MOUSEINFO, WHICHCPU, WHICHJOYSTICK, WHICHVGA
  9738.  
  9739.             EXAMPLE
  9740.  
  9741.             REM FIND OUT WHAT KIND OF MOUSE WE HAVE
  9742.             REM $INCLUDE: 'SVGABC.BI'
  9743.             DEFINT A-Z
  9744.  
  9745.             CLS
  9746.             MOUSE = WHICHMOUSE
  9747.             IF MOUSE > 0 THEN
  9748.                MOUSEINFO MJV, MNV, TP, I
  9749.                VER$ = STR$(MNV)
  9750.                L = LEN(VER$)
  9751.                VER$ = STR$(MJV) + "." + RIGHT$(VER$, L - 1)
  9752.                VER$ = "Software driver version is" + VER$
  9753.                VER$ = VER$ + " (Microsoft equivalent version)."
  9754.                A$ = "Microsoft compatible mouse detected with"
  9755.                A$ = A$ + STR$(MOUSE) + " buttons on IRQ" + STR$(I) + "."
  9756.                PRINT A$
  9757.                PRINT VER$
  9758.             ELSE
  9759.                PRINT "No Microsoft compatible mouse detected."
  9760.             END IF
  9761.             END
  9762.  
  9763.  
  9764.  
  9765.  
  9766.  
  9767.  
  9768.  
  9769.                                                                         156
  9770.  
  9771.  
  9772.  
  9773.  
  9774.  
  9775.           WHICHVGA
  9776.  
  9777.             PROTOTYPE
  9778.  
  9779.             FUNCTION WHICHVGA% ()
  9780.  
  9781.             INPUT
  9782.  
  9783.             no input parameters
  9784.  
  9785.             OUTPUT
  9786.  
  9787.             WHICHVGA returns a code identifying the video card.
  9788.  
  9789.             USAGE
  9790.  
  9791.             WHICHVGA identifies the video card installed and the amount of
  9792.             video memory.  In addition this function sets up the default
  9793.             font and mouse cursor.  This function must be called before
  9794.             any other graphics function.  The code returned identifies the
  9795.             video card according to the following table:
  9796.  
  9797.           1  Acumos AVGA2/3 SuperVGA
  9798.           2  ATI Technologies 18/28/38/68800
  9799.              SuperVGA
  9800.           3  Ahead V5000 ver A SuperVGA
  9801.           4  Ahead V5000 ver B SuperVGA
  9802.           5  Chips and Technologies 82C45x SuperVGA
  9803.           6  Cirrus Logic CL-GD 5xx, 6xx, 28xx,
  9804.              54xx, 62xx SuperVGA
  9805.           7  Everex Micro Enhancer Ev236/6xx
  9806.              SuperVGA
  9807.           8  Genoa 61/62/63/64/6600 SuperVGA
  9808.           9  NCR 77C21/22/22E/22E+ SuperVGA
  9809.           10 Oak Technologies OTI-037C/067/077/087
  9810.              SuperVGA
  9811.           11 Paradise/Western Digital PVGA1A,
  9812.              WD90C00/1x/2x/3x SuperVGA
  9813.           12 Realtek RT3106 SuperVGA
  9814.           13 Trident 8800CS, 8900B/C/CL/CX, 90x0
  9815.              SuperVGA
  9816.           14 Tseng Labs ET3000-AX/BX/BP SuperVGA
  9817.           15 Tseng Labs ET4000/W32/W32I SuperVGA
  9818.           16 VESA compatible SuperVGA
  9819.           17 Video 7 HT-208/16 SuperVGA
  9820.           18 Avance Logic AL2101 SuperVGA
  9821.           19 MXIC MX68000/10 SuperVGA
  9822.           20 Primus P2000 SuperVGA
  9823.  
  9824.             Any value returned not found on this table represents an
  9825.             unidentified video card.
  9826.  
  9827.             No graphics functions should be called unless the video card
  9828.             is properly identified.
  9829.  
  9830.  
  9831.                                                                         157
  9832.  
  9833.  
  9834.  
  9835.  
  9836.  
  9837.  
  9838.             SEE ALSO
  9839.  
  9840.             SETCARD, WHICHCPU, WHICHJOYSTICK, WHICHMOUSE, WHICHMEM
  9841.  
  9842.             EXAMPLE
  9843.  
  9844.             REM FIND OUT WHAT KIND OF VIDEO CARD WE HAVE
  9845.             DEFINT A-Z
  9846.  
  9847.             CLS
  9848.             VGA = WHICHVGA
  9849.             SELECT CASE VGA
  9850.                  CASE IS = 1
  9851.                     VGA$ = "Acumos AVGA2/3 SuperVGA"
  9852.                  CASE IS = 2
  9853.                     VGA$ = "ATI Technologies 18/28/38/68800 SuperVGA"
  9854.                  CASE IS = 3
  9855.                       VGA$ = "Ahead V5000 ver A SuperVGA"
  9856.                  CASE IS = 4
  9857.                     VGA$ = "Ahead V5000 ver B SuperVGA"
  9858.                  CASE IS = 5
  9859.                     VGA$ = "Chips and Technologies 82C450/1/2/3/5/6/7
  9860.           SuperVGA"
  9861.                  CASE IS = 6
  9862.                     VGA$ = "Cirrus Logic CL-GD 5xx,6xx,28xx,54xx,62xx
  9863.           SuperVGA"
  9864.                  CASE IS = 7
  9865.                     VGA$ = "Everex Ev236/6xx Micro Enhancer SuperVGA"
  9866.                  CASE IS = 8
  9867.                     VGA$ = "Genoa 61/62/63/64/6600 SuperVGA"
  9868.                  CASE IS = 9
  9869.                     VGA$ = "NCR 77C21/22/22E/22E+ SuperVGA"
  9870.                  CASE IS = 10
  9871.                     VGA$ = "Oak Technologies OTI-037C/067/077/087 SuperVGA"
  9872.                  CASE IS = 11
  9873.                     VGA$ = "Paradise/Western Digital
  9874.           PVGA1A,WD90C00/1x/2x/3x SuperVGA"
  9875.                  CASE IS = 12
  9876.                     VGA$ = "Realtek RT3106 SuperVGA"
  9877.                  CASE IS = 13
  9878.                     VGA$ = "Trident 8800CS,8900B/C/CL/CX,90x0 SuperVGA"
  9879.                  CASE IS = 14
  9880.                     VGA$ = "Tseng Labs ET3000-AX/BX/BP SuperVGA"
  9881.                  CASE IS = 15
  9882.                     VGA$ = "Tseng Labs ET4000/W32/W32I SuperVGA"
  9883.                  CASE IS = 16
  9884.                     VGA$ = "VESA compatible SuperVGA"
  9885.                  CASE IS = 17
  9886.                     VGA$ = "Video 7 HT-208/16 SuperVGA"
  9887.                  CASE IS = 18
  9888.                     VGA$ = "Avance Logic AL2101 SuperVGA"
  9889.                  CASE IS = 19
  9890.                     VGA$ = "MXIC MX68000/10 SuperVGA"
  9891.  
  9892.  
  9893.                                                                         158
  9894.  
  9895.  
  9896.  
  9897.  
  9898.  
  9899.                  CASE IS = 20
  9900.                     VGA$ = "Primus P2000 SuperVGA"
  9901.                  CASE ELSE
  9902.                     VGA$ = "Unknown"
  9903.                     VGA = 0
  9904.             END SELECT
  9905.             PRINT "Video card/chip is identified as a "; VGA$; "."
  9906.             END
  9907.  
  9908.  
  9909.  
  9910.  
  9911.  
  9912.  
  9913.  
  9914.  
  9915.  
  9916.  
  9917.  
  9918.  
  9919.  
  9920.  
  9921.  
  9922.  
  9923.  
  9924.  
  9925.  
  9926.  
  9927.  
  9928.  
  9929.  
  9930.  
  9931.  
  9932.  
  9933.  
  9934.  
  9935.  
  9936.  
  9937.  
  9938.  
  9939.  
  9940.  
  9941.  
  9942.  
  9943.  
  9944.  
  9945.  
  9946.  
  9947.  
  9948.  
  9949.  
  9950.  
  9951.  
  9952.  
  9953.  
  9954.  
  9955.                                                                         159
  9956.  
  9957.  
  9958.  
  9959.  
  9960.  
  9961.           WHICHXMS
  9962.  
  9963.             PROTOTYPE
  9964.  
  9965.             FUNCTION WHICHXMS% (XmsKBytesAvailable%, XmsHandlesAvailable%)
  9966.  
  9967.             INPUT
  9968.  
  9969.             no input parameters
  9970.  
  9971.             OUTPUT
  9972.  
  9973.             WHICHXMS returns a 1 if extended memory support is detected, 0
  9974.             otherwise.
  9975.             XmsKBytesAvailable - number of free kilobytes in extended
  9976.             memory
  9977.             XmsHandlesAvailable - number of available free handles
  9978.  
  9979.             USAGE
  9980.  
  9981.             WHICHXMS detects the existence of extended memory support and
  9982.             sets up the library function calls.  This function must be
  9983.             called before any other extended memory functions.  WHICHXMS
  9984.             also returns the number of free kilobytes of extended memory
  9985.             and the number of available handles.  The number of available
  9986.             handles is limited, normally to 32.  This limit can be
  9987.             modified by changing the extended memory driver (Microsoft's
  9988.             HIMEM.SYS is the most common) command line in the CONFIG.SYS
  9989.             file.
  9990.  
  9991.             SEE ALSO
  9992.  
  9993.             XMSALLOCATE, XMSCOPY, XMSERROR, XMSFREE, XMSGET, XMSPUT
  9994.  
  9995.             EXAMPLE
  9996.  
  9997.             REM THIS WILL SHOW IF XMS MEMORY IS AVAILABLE AND HOW MUCH
  9998.             REM $INCLUDE: 'SVGABC.BI'
  9999.             DEFINT A-Z
  10000.             IF WHICHXMS(MEM, HANDLES) = 1 THEN
  10001.                PRINT "AN XMS MEMORY MANAGER IS INSTALLED (SUCH AS
  10002.             'HIMEM.SYS')"
  10003.                IF MEM > 0 THEN
  10004.                  TOTMEM& = 1024
  10005.                  TOTMEM& = TOTMEM& * MEM
  10006.                  PRINT "A TOTAL OF"; TOTMEM&; "BYTES ARE AVAILABLE"
  10007.                  IF HANDLES > 0 THEN
  10008.                     PRINT "A TOTAL OF"; HANDLES; "HANDLES(S) ARE AVAILABLE"
  10009.                     PRINT "XMS MEMORY IS READY FOR USE"
  10010.                  ELSE
  10011.                     PRINT "SORRY...ALL XMS HANDLES ARE BEING USED"
  10012.                     PRINT "CHANGE (OR ADD) THE '/numhandles' SWITCH ON YOUR
  10013.             XMS MEMORY MANAGER"
  10014.                  END IF
  10015.  
  10016.  
  10017.                                                                         160
  10018.  
  10019.  
  10020.  
  10021.  
  10022.  
  10023.                ELSE
  10024.                  PRINT "SORRY...ALL XMS MEMORY IS ALLOCATED"
  10025.                END IF
  10026.             ELSE
  10027.                PRINT "SORRY...NO ACTIVE XMS MEMORY MANAGER FOUND"
  10028.                PRINT "MAKE SURE YOU HAVE AN XMS MEMORY MANAGER (SUCH AS
  10029.             'HIMEM.SYS' INSTALLED)"
  10030.             END IF
  10031.             END
  10032.  
  10033.  
  10034.  
  10035.  
  10036.  
  10037.  
  10038.  
  10039.  
  10040.  
  10041.  
  10042.  
  10043.  
  10044.  
  10045.  
  10046.  
  10047.  
  10048.  
  10049.  
  10050.  
  10051.  
  10052.  
  10053.  
  10054.  
  10055.  
  10056.  
  10057.  
  10058.  
  10059.  
  10060.  
  10061.  
  10062.  
  10063.  
  10064.  
  10065.  
  10066.  
  10067.  
  10068.  
  10069.  
  10070.  
  10071.  
  10072.  
  10073.  
  10074.  
  10075.  
  10076.  
  10077.  
  10078.  
  10079.                                                                         161
  10080.  
  10081.  
  10082.  
  10083.  
  10084.  
  10085.           XMSALLOCATE
  10086.  
  10087.             PROTOTYPE
  10088.  
  10089.             FUNCTION XMSALLOCATE% (RequestedKBytes%)
  10090.  
  10091.             INPUT
  10092.  
  10093.             RequestedKBytes - requested number of kilobytes of extended
  10094.             memory
  10095.  
  10096.             OUTPUT
  10097.  
  10098.             XMSALLOCATE returns the assigned memory handle if the
  10099.             allocation is successful, 0 otherwise.
  10100.  
  10101.             USAGE
  10102.  
  10103.             XMSALLOCATE attempts to allocate the requested number of
  10104.             kilobytes in extended memory.  If successful, the function
  10105.             returns the handle of the new memory block.  If the function
  10106.             returns zero, then the allocation was unsuccessful; check
  10107.             XMSERROR for error codes.
  10108.  
  10109.             All allocated blocks must be freed using XMSFREE before a
  10110.             program terminates or the memory is lost until the machine is
  10111.             rebooted.  Simply exiting a program will not free allocated
  10112.             extended memory blocks.
  10113.  
  10114.             SEE ALSO
  10115.  
  10116.             WHICHXMS, XMSCOPY, XMSERROR, XMSFREE, XMSGET, XMSPUT
  10117.  
  10118.             EXAMPLE
  10119.  
  10120.             See XMSCOPY
  10121.  
  10122.  
  10123.  
  10124.  
  10125.  
  10126.  
  10127.  
  10128.  
  10129.  
  10130.  
  10131.  
  10132.  
  10133.  
  10134.  
  10135.  
  10136.  
  10137.  
  10138.  
  10139.  
  10140.  
  10141.                                                                         162
  10142.  
  10143.  
  10144.  
  10145.  
  10146.  
  10147.           XMSBLKGET
  10148.  
  10149.             PROTOTYPE
  10150.  
  10151.             FUNCTION XMSBLKGET (X1%, Y1%, X2%, Y2%)
  10152.  
  10153.             INPUT
  10154.  
  10155.             X1, Y1 - top left corner of block
  10156.             X2, Y2 - bottom right corner of block
  10157.  
  10158.             OUTPUT
  10159.  
  10160.             Used as a function, XMSBLKGET returns the assigned XMS memory
  10161.             handle if successful, 0 if it otherwise.
  10162.  
  10163.             USAGE
  10164.  
  10165.             XMSBLKGET stores the pixel data contained within the block
  10166.             defined by (X1, Y1)-(X2, Y2) in extended memory.  A minimum of
  10167.             32k of XMS memory will be allocated regardless of the size of
  10168.             the graphics block.  Note that XMSBLKGET enforces X2>X1 and
  10169.             Y2>Y1.  Also, the coordinates must be valid on the screen at
  10170.             the current resolution.  The bitmap is stored such that the
  10171.             first integer in the allocated XMS block is the width and the
  10172.             second integer is the height.  These are followed by a long
  10173.             integer (4 bytes) that specifies the total size of the
  10174.             allocated XMS block.  The remaining bytes are the bitmap
  10175.             raster data stored by rows starting at the top of the block.
  10176.             If the function was unsuccessful, check XMSERROR for error
  10177.             codes.
  10178.  
  10179.             All allocated XMS blocks must be freed using XMSFREE before a
  10180.             program terminates or the memory is lost until the machine is
  10181.             rebooted.  Simply exiting a program will not free allocated
  10182.             extended memory blocks.
  10183.  
  10184.             SEE ALSO
  10185.  
  10186.             XMSBLKPUT, XMSERROR, XMSFREE, XMSSCREENGET, XMSSCREENPUT,
  10187.  
  10188.             EXAMPLE
  10189.  
  10190.             REM THIS WILL COPY A LARGE GRAPHICS BLOCK (ABOUT 80K)
  10191.             REM FROM ONE PART OF THE SCRREN TO ANOTHER
  10192.             REM $INCLUDE: 'SVGABC.BI'
  10193.             DEFINT A-Z
  10194.  
  10195.             CLS
  10196.             IF WHICHXMS(MEM, HANDLES) = 1 THEN
  10197.                IF MEM < 1 OR HANDLES < 1 THEN
  10198.                  PRINT "SORRY...THERE IS EITHER NO FREE XMS MEMORY OR NO
  10199.             FREE XMS HANDLES"
  10200.                  END
  10201.  
  10202.  
  10203.                                                                         163
  10204.  
  10205.  
  10206.  
  10207.  
  10208.  
  10209.                END IF
  10210.             ELSE
  10211.                PRINT "SORRY...NO ACTIVE XMS MEMORY MANAGER FOUND"
  10212.                PRINT "MAKE SURE YOU HAVE A XMS MEMORY MANAGER (SUCH AS
  10213.             'HIMEM.SYS' INSTALLED)"
  10214.                END
  10215.             END IF
  10216.             IF WHICHVGA = 0 THEN
  10217.                PRINT "CAN'T ID VIDEO CARD"
  10218.                END
  10219.             END IF
  10220.             DUMMY = RES640
  10221.             DRWFILLBOX 1, 10, 0, 0, 200, 400
  10222.             FOR I = 0 TO 200
  10223.                X1 = RND * 200
  10224.                Y1 = RND * 400
  10225.                X2 = RND * 200
  10226.                Y2 = RND * 400
  10227.                C = RND * 16
  10228.                DRWLINE 1, C, X1, Y1, X2, Y2
  10229.             NEXT I
  10230.             DRWBOX 1, 15, 0, 0, 200, 400
  10231.             REM *ALLOCATE A BLOCK OF XMS MEMORY*
  10232.             OurHandle = XMSBLKGET(0, 0, 200, 400)
  10233.             IF OurHandle = 0 THEN
  10234.                DUMMY = RESTEXT
  10235.                DUMMY = XMSFREE(OurHandle)
  10236.                PRINT "OPPS..THERE IS SOME ERROR...UNABLE TO ALLOCATE XMS"
  10237.                END
  10238.             END IF
  10239.             ER = XMSBLKPUT(1, 175, 75, OurHandle)
  10240.             DUMMY = XMSFREE(OurHandle)
  10241.             WHILE INKEY$ = ""
  10242.             WEND
  10243.             DUMMY = RESTEXT
  10244.             END
  10245.  
  10246.  
  10247.  
  10248.  
  10249.  
  10250.  
  10251.  
  10252.  
  10253.  
  10254.  
  10255.  
  10256.  
  10257.  
  10258.  
  10259.  
  10260.  
  10261.  
  10262.  
  10263.  
  10264.  
  10265.                                                                         164
  10266.  
  10267.  
  10268.  
  10269.  
  10270.  
  10271.           XMSBLKPUT
  10272.  
  10273.             PROTOTYPE
  10274.  
  10275.             FUNCTION XMSBLKPUT (Mode%, X%, Y%, SrcXmsHandle%)
  10276.  
  10277.             INPUT
  10278.  
  10279.             Mode - pixel write mode (set=1, xor=2, or=3, and=4)
  10280.             X, Y - location for top left corner of block
  10281.             SrcXmsHandle - handle of source extended memory block
  10282.  
  10283.             OUTPUT
  10284.  
  10285.             Used as a function, XMSBLKPUT returns a 1 if successful, 0
  10286.             otherwise.
  10287.  
  10288.             USAGE
  10289.  
  10290.             XMSBLKPUT places the pixel data contained in XMS memory
  10291.             referenced by SrcXmsHandle on the screen.  The top, left
  10292.             corner of the block is specified by (x, y).  Any (x, y) is
  10293.             acceptable and any portion of the block that lies outside of
  10294.             the currently defined viewport will not be drawn.  If the
  10295.             function was unseccessful, check XMSERROR for error codes.
  10296.  
  10297.             All allocated XMS blocks must be freed using XMSFREE before a
  10298.             program terminates or the memory is lost until the machine is
  10299.             rebooted.  Simply exiting a program will not free allocated
  10300.             extended memory blocks.
  10301.  
  10302.             SEE ALSO
  10303.  
  10304.             XMSBLKGET, XMSERROR, XMSFREE, XMSSCREENGET, XMSSCREENPUT
  10305.  
  10306.             EXAMPLE
  10307.  
  10308.             See XMSBLKGET
  10309.  
  10310.  
  10311.  
  10312.  
  10313.  
  10314.  
  10315.  
  10316.  
  10317.  
  10318.  
  10319.  
  10320.  
  10321.  
  10322.  
  10323.  
  10324.  
  10325.  
  10326.  
  10327.                                                                         165
  10328.  
  10329.  
  10330.  
  10331.  
  10332.  
  10333.           XMSCOPY
  10334.  
  10335.             PROTOTYPE
  10336.  
  10337.             FUNCTION XMSCOPY% (SrcXmsHandle%, SrcOffset&, DestXmsHandle%,
  10338.             DestOffset&, NumBytes&)
  10339.  
  10340.             INPUT
  10341.  
  10342.             SrcXmsHandle - handle of source extended memory block
  10343.             SrcOffset - number of bytes from beginning of source memory
  10344.             block
  10345.             DestXmsHandle - handle of destination extended memory block
  10346.             DestOffset - number of bytes from beginning of destination
  10347.             memory block
  10348.             NumBytes - number of bytes to copy from source to destination
  10349.             (must be even)
  10350.  
  10351.             OUTPUT
  10352.  
  10353.             XMSCOPY returns a 1 if copy was successful, 0 otherwise.
  10354.  
  10355.             USAGE
  10356.  
  10357.             XMSCOPY copies the number of bytes specified in NumBytes from
  10358.             the source extended memory block to the destination extended
  10359.             memory block.  NumBytes must be an even number.  The copy may
  10360.             begin and/or end offset from the beginning of the source and
  10361.             destination blocks by passing non zero values in SrcOffset
  10362.             and/or DestOffset.  The copy will occur faster if both offsets
  10363.             are divisible by four.  If the copy was unsuccessful, check
  10364.             XMSERROR for error codes.
  10365.  
  10366.             SEE ALSO
  10367.  
  10368.             WHICHXMS, XMSALLOCATE, XMSERROR, XMSFREE, XMSGET, XMSPUT
  10369.  
  10370.             EXAMPLE
  10371.  
  10372.             REM THIS WILL COPY ONE ARRAY INTO ONE XMS BLOCK AND THEN COPY
  10373.             IT
  10374.             REM TO A DIFFERENT XMS BLOCK, AND THEN COPY THAT BACK INTO
  10375.             ANOTHER ARRAY
  10376.             REM $INCLUDE: 'SVGABC.BI'
  10377.             DEFINT A-Z
  10378.  
  10379.             REM *DIMENSION OUR SOURCE AND DESTINATION ARRAYS*
  10380.             DIM TEST1(0 TO 9) AS INTEGER
  10381.             DIM TEST2(0 TO 9) AS INTEGER
  10382.             CLS
  10383.  
  10384.             REM *MAKE SURE XMS IS READY AND AVAILBLE*
  10385.             IF WHICHXMS(MEM, HANDLES) = 1 THEN
  10386.                IF MEM < 1 OR HANDLES < 1 THEN
  10387.  
  10388.  
  10389.                                                                         166
  10390.  
  10391.  
  10392.  
  10393.  
  10394.  
  10395.                  PRINT "SORRY...THERE IS EITHER NO FREE XMS MEMORY OR NO
  10396.             FREE XMS HANDLES"
  10397.                  END
  10398.                END IF
  10399.             ELSE
  10400.                PRINT "SORRY...NO ACTIVE XMS MEMORY MANAGER FOUND"
  10401.                PRINT "MAKE SURE YOU HAVE A XMS MEMORY MANAGER (SUCH AS
  10402.             'HIMEM.SYS' INSTALLED)"
  10403.                END
  10404.             END IF
  10405.  
  10406.             REM *PUT SOME DATA INTO THE SOURCE ARRAY*
  10407.             FOR I = 0 TO 9
  10408.                TEST1(I) = I * 10
  10409.             NEXT I
  10410.  
  10411.             REM *ALLOCATE THE FIRST XMS MEMORY BLOCK*
  10412.             OurHandle1 = XMSALLOCATE(1)
  10413.             IF OurHandle1 = 0 THEN
  10414.                PRINT "OPPS..THERE IS SOME ERROR...UNABLE TO ALLOCATE XMS"
  10415.                PRINT "ERROR #"; XMSERROR
  10416.                ER = XMSFREE(OurHandle1)
  10417.                END
  10418.             END IF
  10419.  
  10420.             REM *ALLOCATE THE SECOND XMS MEMORY BLOCK*
  10421.             OurHandle2 = XMSALLOCATE(1)
  10422.             IF OurHandle2 = 0 THEN
  10423.                PRINT "OPPS..THERE IS SOME ERROR...UNABLE TO ALLOCATE XMS"
  10424.                PRINT "ERROR #"; XMSERROR
  10425.                ER = XMSFREE(OurHandle1)
  10426.                ER = XMSFREE(OurHandle2)
  10427.                END
  10428.             END IF
  10429.  
  10430.             REM *COPY OUR SOURCE ARRAY INTO OUR FIRST XMS BLOCK*
  10431.             I = XMSPUT(TEST1(0), OurHandle1, 0, 20)
  10432.             IF I = 0 THEN
  10433.                PRINT "OPPS..THERE IS SOME ERROR...SEE THE ERROR CODE
  10434.             LIST..."
  10435.                PRINT "ERROR #"; XMSERROR
  10436.                ER = XMSFREE(OurHandle1)
  10437.                ER = XMSFREE(OurHandle2)
  10438.                END
  10439.             END IF
  10440.  
  10441.             REM *COPY THE FIRST XMS BLOCK TO THE SECOND XMS BLOCK*
  10442.             IF XMSCOPY(OurHandle1, 0, OurHandle2, 0, 20) = 0 THEN
  10443.                PRINT "OPPS..THERE IS SOME ERROR...SEE THE ERROR CODE
  10444.             LIST..."
  10445.                PRINT "ERROR #"; XMSERROR
  10446.                ER = XMSFREE(OurHandle1)
  10447.                ER = XMSFREE(OurHandle2)
  10448.                END
  10449.  
  10450.  
  10451.                                                                         167
  10452.  
  10453.  
  10454.  
  10455.  
  10456.  
  10457.             END IF
  10458.  
  10459.             REM *COPY DATA FROM THE SECOND XMS BLOCK TO OUR DESTINATION
  10460.             ARRAY*
  10461.             IF XMSGET(OurHandle2, 0, TEST2(0), 20) = 0 THEN
  10462.                PRINT "OPPS..THERE IS SOME ERROR...SEE THE ERROR CODE
  10463.             LIST..."
  10464.                PRINT "ERROR #"; ER
  10465.                ER = XMSFREE(OurHandle1)
  10466.                ER = XMSFREE(OurHandle2)
  10467.                END
  10468.             END IF
  10469.  
  10470.             REM *FREE THE XMS BLOCKS WE HAVE ALLOCATED*
  10471.             ER = XMSFREE(OurHandle1)
  10472.             ER = XMSFREE(OurHandle2)
  10473.  
  10474.             REM *SHOW THE RESULTS*
  10475.             PRINT "OK...WE INITILIZED ONE ARRAY,PUT A COPY OF IT INTO
  10476.             XMS,"
  10477.             PRINT "THEN WE COPIED THAT XMS BLOCK TO ANOTHER XMS BLOCK,
  10478.             AND"
  10479.             PRINT "THEN PUT A COPY OF THE SECOND XMS BLOCK INTO A NEW
  10480.             ARRAY;"
  10481.             PRINT "HERE ARE THE RESULTS:"
  10482.             PRINT
  10483.             PRINT "SOURCE ARRAY", , "DESTINATION ARRAY"
  10484.             FOR I = 0 TO 9
  10485.                PRINT TEST1(I), , TEST2(I)
  10486.             NEXT I
  10487.             END
  10488.  
  10489.  
  10490.  
  10491.  
  10492.  
  10493.  
  10494.  
  10495.  
  10496.  
  10497.  
  10498.  
  10499.  
  10500.  
  10501.  
  10502.  
  10503.  
  10504.  
  10505.  
  10506.  
  10507.  
  10508.  
  10509.  
  10510.  
  10511.  
  10512.  
  10513.                                                                         168
  10514.  
  10515.  
  10516.  
  10517.  
  10518.  
  10519.           XMSERROR
  10520.  
  10521.             PROTOTYPE
  10522.  
  10523.             FUNCTION XMSERROR% ()
  10524.  
  10525.             INPUT
  10526.  
  10527.             no input parameters
  10528.  
  10529.             OUTPUT
  10530.  
  10531.             XMSERROR returns the error code from the most recent XMS
  10532.             function call.
  10533.  
  10534.             USAGE
  10535.  
  10536.             XMSERROR returns the error code from the most recent XMS
  10537.             function call.  Each XMS function resets the error code to
  10538.             zero.  Therefore, if there has been an error, the error code
  10539.             should be checked immediately.  The error code will be one of
  10540.             the following:
  10541.  
  10542.             0    no error
  10543.             1    WHICHXMS has not been
  10544.                  called
  10545.             2    number of bytes to
  10546.                  copy is zero
  10547.             3    number of bytes to
  10548.                  copy is odd
  10549.             4    offset into XMS block
  10550.                  is zero
  10551.             128  Function not
  10552.                  implemented
  10553.             129  VDISK device driver
  10554.                  was detected
  10555.             142  General driver error
  10556.             143  Unrecoverable driver
  10557.                  error
  10558.             146  DX is less than
  10559.                  /HMAMIN= parameter
  10560.             160  All extended memory is
  10561.                  allocated
  10562.             161  XMM handles are
  10563.                  exhausted
  10564.             162  Handle is invalid
  10565.             163  Source handle is
  10566.                  invalid
  10567.             164  Source offset is
  10568.                  invalid
  10569.             165  Destination handle is
  10570.                  invalid
  10571.             166  Destination offset is
  10572.                  invalid
  10573.  
  10574.  
  10575.                                                                         169
  10576.  
  10577.  
  10578.  
  10579.  
  10580.  
  10581.             167  Length is invalid
  10582.             168  Overlap in move
  10583.                  request is invalid
  10584.             169  Parity error detected
  10585.             171  Block locked
  10586.  
  10587.             SEE ALSO
  10588.  
  10589.             WHICHXMS, XMSALLOCATE, XMSBLKGET, XMSBLKPUT, XMSCOPY, XMSFREE,
  10590.             XMSGET, XMSPUT, XMSSCREENGET, XMSSCREENPUT
  10591.  
  10592.             EXAMPLE
  10593.  
  10594.             See XMSCOPY
  10595.  
  10596.  
  10597.  
  10598.  
  10599.  
  10600.  
  10601.  
  10602.  
  10603.  
  10604.  
  10605.  
  10606.  
  10607.  
  10608.  
  10609.  
  10610.  
  10611.  
  10612.  
  10613.  
  10614.  
  10615.  
  10616.  
  10617.  
  10618.  
  10619.  
  10620.  
  10621.  
  10622.  
  10623.  
  10624.  
  10625.  
  10626.  
  10627.  
  10628.  
  10629.  
  10630.  
  10631.  
  10632.  
  10633.  
  10634.  
  10635.  
  10636.  
  10637.                                                                         170
  10638.  
  10639.  
  10640.  
  10641.  
  10642.  
  10643.           XMSFREE
  10644.  
  10645.             PROTOTYPE
  10646.  
  10647.             FUNCTION XMSFREE% (XmsHandle%)
  10648.  
  10649.             INPUT
  10650.  
  10651.             XmsHandle - handle of extended memory block to free
  10652.  
  10653.             OUTPUT
  10654.  
  10655.             XMSFREE returns 1 if extended memory block was deallocated, 0
  10656.             otherwise.
  10657.  
  10658.             USAGE
  10659.  
  10660.             XMSFREE deallocates the specified extended memory block.  All
  10661.             allocated blocks must be freed before a program terminates or
  10662.             the memory is lost until the machine is rebooted.  Simply
  10663.             exiting a program will not free allocated extended memory
  10664.             blocks.  If the function was unsuccessful, check XMSERROR for
  10665.             error codes.
  10666.  
  10667.             SEE ALSO
  10668.  
  10669.             WHICHXMS, XMSALLOCATE, XMSBLKGET, XMSBLKPUT, XMSCOPY,
  10670.             XMSERROR, XMSGET, XMSPUT, XMSSCREENGET, XMSSCREENPUT
  10671.  
  10672.             EXAMPLE
  10673.  
  10674.             See XMSCOPY
  10675.  
  10676.  
  10677.  
  10678.  
  10679.  
  10680.  
  10681.  
  10682.  
  10683.  
  10684.  
  10685.  
  10686.  
  10687.  
  10688.  
  10689.  
  10690.  
  10691.  
  10692.  
  10693.  
  10694.  
  10695.  
  10696.  
  10697.  
  10698.  
  10699.                                                                         171
  10700.  
  10701.  
  10702.  
  10703.  
  10704.  
  10705.           XMSGET
  10706.  
  10707.             PROTOTYPE
  10708.  
  10709.             FUNCTION XMSGET% (SrcXmsHandle%, SrcOffset&, DestVariable%,
  10710.             NumBytes&)
  10711.  
  10712.             INPUT
  10713.  
  10714.             SrcXmsHandle - handle of source extended memory block
  10715.             SrcOffset - number of bytes from beginning of source memory
  10716.             block
  10717.             NumBytes - number of bytes to copy from extended memory to
  10718.             conventional memory (must be even)
  10719.  
  10720.             OUTPUT
  10721.  
  10722.             XMSGET returns 0 if the copy was successful, an error code
  10723.             otherwise.
  10724.             DestVariable - integer variable or array holding copied data
  10725.  
  10726.             USAGE
  10727.  
  10728.             XMSGET retrieves data from extended memory and places it in
  10729.             conventional memory.  The number of bytes copied must be an
  10730.             even number and cannot be larger than 65536.  The copy may
  10731.             begin off the beginning of the source extended memory block by
  10732.             specifying a non zero SrcOffset.  If the function was
  10733.             unsuccessful, check XMSERROR for error codes.
  10734.  
  10735.             SEE ALSO
  10736.  
  10737.             WHICHXMS, XMSALLOCATE, XMSCOPY, XMSERROR, XMSFREE, XMSPUT
  10738.  
  10739.             EXAMPLE
  10740.  
  10741.             See XMSCOPY
  10742.  
  10743.  
  10744.  
  10745.  
  10746.  
  10747.  
  10748.  
  10749.  
  10750.  
  10751.  
  10752.  
  10753.  
  10754.  
  10755.  
  10756.  
  10757.  
  10758.  
  10759.  
  10760.  
  10761.                                                                         172
  10762.  
  10763.  
  10764.  
  10765.  
  10766.  
  10767.           XMSPUT
  10768.  
  10769.             PROTOTYPE
  10770.  
  10771.             FUNCTION XMSPUT% (SrcVariable%, DestXmsHandle%, DestOffset&,
  10772.             NumBytes&)
  10773.  
  10774.             INPUT
  10775.  
  10776.             SrcVariable - source variable or array in conventional memory
  10777.             DestXmsHandle - handle of destination extended memory block
  10778.             DestOffset - number of bytes from beginning of destination
  10779.             memory block
  10780.             NumBytes - number of bytes to copy from conventional memory to
  10781.             extended memory (must be even)
  10782.  
  10783.             OUTPUT
  10784.  
  10785.             XMSPUT returns 1 if the copy was successful, 0 otherwise.
  10786.  
  10787.             USAGE
  10788.  
  10789.             XMSPUT copies data from conventional memory to extended
  10790.             memory.  The number of bytes copied must be an even number and
  10791.             cannot be larger than 65536.  The destination may begin off
  10792.             the beginning of the extended memory block by specifying a non
  10793.             zero DestOffset.  If the function was unsuccessful, check
  10794.             XMSERROR for error codes.
  10795.  
  10796.             SEE ALSO
  10797.  
  10798.             WHICHXMS, XMSALLOCATE, XMSCOPY, XMSERROR, XMSFREE, XMSGET
  10799.  
  10800.             EXAMPLE
  10801.  
  10802.             See XMSCOPY
  10803.  
  10804.  
  10805.  
  10806.  
  10807.  
  10808.  
  10809.  
  10810.  
  10811.  
  10812.  
  10813.  
  10814.  
  10815.  
  10816.  
  10817.  
  10818.  
  10819.  
  10820.  
  10821.  
  10822.  
  10823.                                                                         173
  10824.  
  10825.  
  10826.  
  10827.  
  10828.  
  10829.           XMSSCREENGET
  10830.  
  10831.             PROTOTYPE
  10832.  
  10833.             FUNCTION XMSSCREENGET ( )
  10834.  
  10835.             INPUT
  10836.  
  10837.             no input parameters
  10838.  
  10839.             OUTPUT
  10840.  
  10841.             Used as a function, XMSSCREENGET returns the assigned XMS
  10842.             memory handle if successful, 0 if it otherwise.
  10843.  
  10844.             USAGE
  10845.  
  10846.             XMSSCREENGET stores the pixel data contained within the entire
  10847.             active screen.  The bitmap is stored such that the first
  10848.             integer in the allocated XMS block is the width and the second
  10849.             integer is the height.  These are followed by a long integer
  10850.             (4 bytes) that specifies the total size of the allocated XMS
  10851.             block.  The remaining bytes are the bitmap raster data stored
  10852.             by rows starting at the top of the screen.  Note that this
  10853.             function is about twice as fast as using XMSBLKGET to save the
  10854.             entire screen.  If the function was unseccessful, check
  10855.             XMSERROR for error codes.
  10856.  
  10857.             All allocated XMS blocks must be freed using XMSFREE before a
  10858.             program terminates or the memory is lost until the machine is
  10859.             rebooted.  Simply exiting a program will not free allocated
  10860.             extended memory blocks.
  10861.  
  10862.             SEE ALSO
  10863.  
  10864.             XMSBLKGET, XMSBLKPUT, XMSERROR, XMSFREE, XMSSCREENPUT
  10865.  
  10866.             EXAMPLE
  10867.  
  10868.             REM THIS WILL SAVE THE ENTIRE SCREEN IN XMS MSMORY
  10869.             REM $INCLUDE: 'SVGABC.BI'
  10870.             DEFINT A-Z
  10871.  
  10872.             CLS
  10873.             IF WHICHXMS(MEM, HANDLES) = 1 THEN
  10874.                IF MEM < 1 OR HANDLES < 1 THEN
  10875.                  PRINT "SORRY...THERE IS EITHER NO FREE XMS MEMORY OR NO
  10876.             FREE XMS HANDLES"
  10877.                  END
  10878.                END IF
  10879.             ELSE
  10880.                PRINT "SORRY...NO ACTIVE XMS MEMORY MANAGER FOUND"
  10881.                PRINT "MAKE SURE YOU HAVE A XMS MEMORY MANAGER (SUCH AS
  10882.             'HIMEM.SYS' INSTALLED)"
  10883.  
  10884.  
  10885.                                                                         174
  10886.  
  10887.  
  10888.  
  10889.  
  10890.  
  10891.                END
  10892.             END IF
  10893.             IF WHICHVGA = 0 THEN
  10894.                PRINT "CAN'T ID VIDEO CARD"
  10895.                END
  10896.             END IF
  10897.             DUMMY = RES640
  10898.             DRWFILLBOX 1, 10, 0, 0, GETMAXX, GETMAXY
  10899.             FOR I = 0 TO 200
  10900.                X1 = RND * GETMAXX
  10901.                Y1 = RND * GETMAXY
  10902.                X2 = RND * GETMAXX
  10903.                Y2 = RND * GETMAXY
  10904.                C = RND * 16
  10905.                DRWLINE 1, C, X1, Y1, X2, Y2
  10906.             NEXT I
  10907.             DRWBOX 1, 15, 0, 0, GETMAXX, GETMAXY
  10908.             REM *ALLOCATE A BLOCK OF XMS MEMORY*
  10909.             OurHandle = XMSSCREENGET
  10910.             IF OurHandle = 0 THEN
  10911.                DUMMY = RESTEXT
  10912.                DUMMY = XMSFREE(OurHandle)
  10913.                PRINT "OPPS..THERE IS SOME ERROR...UNABLE TO ALLOCATE XMS"
  10914.                END
  10915.             END IF
  10916.             FILLSCREEN 0
  10917.             DRWSTRING 1, 10, 0, "PRESS A KEY...", 0, 0
  10918.             WHILE INKEY$ = ""
  10919.             WEND
  10920.             ER = XMSSCREENPUT(OurHandle)
  10921.             DUMMY = XMSFREE(OurHandle)
  10922.             WHILE INKEY$ = ""
  10923.             WEND
  10924.             DUMMY = RESTEXT
  10925.             END
  10926.  
  10927.  
  10928.  
  10929.  
  10930.  
  10931.  
  10932.  
  10933.  
  10934.  
  10935.  
  10936.  
  10937.  
  10938.  
  10939.  
  10940.  
  10941.  
  10942.  
  10943.  
  10944.  
  10945.  
  10946.  
  10947.                                                                         175
  10948.  
  10949.  
  10950.  
  10951.  
  10952.  
  10953.           XMSSCREENPUT
  10954.  
  10955.             PROTOTYPE
  10956.  
  10957.             FUNCTION XMSSCREENPUT (SrcXmsHandle%)
  10958.  
  10959.             INPUT
  10960.  
  10961.             SrcXmsHandle - handle of source extended memory block
  10962.  
  10963.             OUTPUT
  10964.  
  10965.             Used as a function, XMSSCREENPUT returns a 1 if successful, 0
  10966.             otherwise.
  10967.  
  10968.             USAGE
  10969.  
  10970.             XMSSCREENPUT places the complete screen pixel data contained
  10971.             in xms memory referenced by SrcXmsHandle on the screen.  The
  10972.             current screen resolution must be the same as the saved screen
  10973.             resolution. this function is not bound by the current
  10974.             viewport.  If the function was unseccessful, check XMSERROR
  10975.             for error codes.
  10976.  
  10977.             SEE ALSO
  10978.  
  10979.             XMSBLKGET, XMSBLKPUT, XMSERROR, XMSFREE, XMSSCREENPUT
  10980.  
  10981.             EXAMPLE
  10982.  
  10983.             See XMSSCREENGET
  10984.  
  10985.  
  10986.  
  10987.  
  10988.  
  10989.  
  10990.  
  10991.  
  10992.  
  10993.  
  10994.  
  10995.  
  10996.  
  10997.  
  10998.  
  10999.  
  11000.  
  11001.  
  11002.  
  11003.  
  11004.  
  11005.  
  11006.  
  11007.  
  11008.  
  11009.                                                                         176
  11010.  
  11011.  
  11012.  
  11013.  
  11014.  
  11015.           APPENDIX A.  SVGABC.BI
  11016.  
  11017.           This is the header file containing function declarations and
  11018.           structure definitions for SVGAQB.LIB and SVGAPV.LIB.  This file
  11019.           should be included in every program that uses this library.  To
  11020.           properly include the header file, place the following line at the
  11021.           top of the every program module:
  11022.  
  11023.                               REM $INCLUDE: 'SVGABC.BI'
  11024.  
  11025.           Without these declarations and definitions, the compiler will be
  11026.           unable to compile any program using the commands found in this
  11027.           library.
  11028.  
  11029.           REM SVGAQB,SVGAPV GRAPHICS LIBRARY INCLUDE FILE FOR MS QuickBasic
  11030.           4.5,
  11031.           REM MS PDS and MS VBDOS
  11032.           REM COPYRIGHT 1993-1995 BY STEPHEN L. BALKUM AND DANIEL A. SILL
  11033.           REM ZEPHYR SOFTWARE P.O. BOX 7704, AUSTIN, TEXAS  78713-7704
  11034.           REM LAST UPDATE 1/1/95
  11035.  
  11036.           TYPE P2DType
  11037.             X AS INTEGER
  11038.             Y AS INTEGER
  11039.           END TYPE
  11040.  
  11041.           TYPE P3Dtype
  11042.             X AS INTEGER
  11043.             Y AS INTEGER
  11044.             Z AS INTEGER
  11045.           END TYPE
  11046.  
  11047.           TYPE PROJType
  11048.             EYEX AS INTEGER
  11049.             EYEY AS INTEGER
  11050.             EYEZ AS INTEGER
  11051.             SCRD AS INTEGER
  11052.             THETA AS INTEGER
  11053.             PHI AS INTEGER
  11054.           END TYPE
  11055.  
  11056.           DECLARE SUB BLKGET (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%,
  11057.           SEG GfxBlk%)
  11058.           DECLARE SUB BLKPUT (BYVAL Mode%, BYVAL X%, BYVAL Y%, SEG GfxBlk%)
  11059.           DECLARE SUB BLKRESIZE (BYVAL X%, BYVAL Y%, SEG SourceGfxBlk%, SEG
  11060.           DestGfxBlk%)
  11061.           DECLARE FUNCTION BLKROTATE% (BYVAL Ang%, BYVAL BackFill%, SEG
  11062.           SourceGfxBlk%, SEG DestGfxBlk%)
  11063.           DECLARE FUNCTION BLKROTATESIZE& (BYVAL Ang%, SEG SourceGfxBlk%)
  11064.           DECLARE SUB BYTECOPY (SEG SourceArray%, SEG DestArray%, BYVAL
  11065.           NumOfBytes&)
  11066.           DECLARE SUB D2ROTATE (BYVAL Points%, BYVAL XOrigin%, BYVAL
  11067.           YOrigin%, BYVAL Ang%, SEG InAry%, SEG OutAry%)
  11068.  
  11069.  
  11070.  
  11071.                                                                         177
  11072.  
  11073.  
  11074.  
  11075.  
  11076.  
  11077.           DECLARE SUB D2SCALE (BYVAL Points%, BYVAL XSCALE%, BYVAL YSCALE%,
  11078.           SEG InAry%, SEG OutAry%)
  11079.           DECLARE SUB D2TRANSLATE (BYVAL Points%, BYVAL XTRANS%, BYVAL
  11080.           YTRANS%, SEG InAry%, SEG OutAry%)
  11081.           DECLARE FUNCTION D3PROJECT% (BYVAL Points%, SEG ProjParms%, SEG
  11082.           InAry%, SEG OutAry%)
  11083.           DECLARE SUB D3ROTATE (BYVAL Points%, BYVAL XOrigin%, BYVAL
  11084.           YOrigin%, BYVAL ZOrigin%, BYVAL ZRAng%, BYVAL YRAng%, BYVAL
  11085.           XRAng%, SEG InAry%, SEG OutAry%)
  11086.           DECLARE SUB D3SCALE (BYVAL Points%, BYVAL XSCALE%, BYVAL YSCALE%,
  11087.           BYVAL ZScale%, SEG InAry%, SEG OutAry%)
  11088.           DECLARE SUB D3TRANSLATE (BYVAL Points%, BYVAL XTRANS%, BYVAL
  11089.           YTRANS%, BYVAL ZTrans%, SEG InAry%, SEG OutAry%)
  11090.           DECLARE SUB DRWALINE (BYVAL ColrBits%, BYVAL Colr%, BYVAL X1%,
  11091.           BYVAL Y1%, BYVAL X2%, BYVAL Y2%)
  11092.           DECLARE SUB DRWBOX (BYVAL Mode%, BYVAL Colr%, BYVAL X1%, BYVAL
  11093.           Y1%, BYVAL X2%, BYVAL Y2%)
  11094.           DECLARE SUB DRWCIRARC (BYVAL Mode%, BYVAL Colr%, BYVAL CenterX%,
  11095.           BYVAL CenterY%, BYVAL Radius%, BYVAL StartAng&, BYVAL EndAng&)
  11096.           DECLARE SUB DRWCIRCLE (BYVAL Mode%, BYVAL Colr%, BYVAL CenterX%,
  11097.           BYVAL CenterY%, BYVAL Radius%)
  11098.           DECLARE SUB DRWCUBICBEZIER (BYVAL Mode%, BYVAL Colr%, SEG Pon1%,
  11099.           SEG Poff1%, SEG Poff2%, SEG Pon2%)
  11100.           DECLARE SUB DRWELLARC (BYVAL Mode%, BYVAL Colr%, BYVAL CenterX%,
  11101.           BYVAL CenterY%, BYVAL RadiusX%, BYVAL RadiusY%, BYVAL StartAng&,
  11102.           BYVAL EndAng&)
  11103.           DECLARE SUB DRWELLIPSE (BYVAL Mode%, BYVAL Colr%, BYVAL CenterX%,
  11104.           BYVAL CenterY%, BYVAL RadiusX%, BYVAL RadiusY%)
  11105.           DECLARE SUB DRWFILLBOX (BYVAL Mode%, BYVAL Colr%, BYVAL X1%,
  11106.           BYVAL Y1%, BYVAL X2%, BYVAL Y2%)
  11107.           DECLARE SUB DRWFILLCIRCLE (BYVAL Mode%, BYVAL Colr%, BYVAL
  11108.           CenterX%, BYVAL CenterY%, BYVAL Radius%)
  11109.           DECLARE SUB DRWFILLELLIPSE (BYVAL Mode%, BYVAL Colr%, BYVAL
  11110.           CenterX%, BYVAL CenterY%, BYVAL RadiusX%, BYVAL RadiusY%)
  11111.           DECLARE SUB DRWLINE (BYVAL Mode%, BYVAL Colr%, BYVAL X1%, BYVAL
  11112.           Y1%, BYVAL X2%, BYVAL Y2%)
  11113.           DECLARE SUB DRWPOINT (BYVAL Mode%, BYVAL Colr%, BYVAL X%, BYVAL
  11114.           Y%)
  11115.           DECLARE SUB DRWRCIRARC (BYVAL Mode%, BYVAL Colr%, BYVAL CenterX%,
  11116.           BYVAL CenterY%, BYVAL Radius%, BYVAL StartAng!, BYVAL EndAng!)
  11117.           DECLARE SUB DRWRELLARC (BYVAL Mode%, BYVAL Colr%, BYVAL CenterX%,
  11118.           BYVAL CenterY%, BYVAL RadiusX%, BYVAL RadiusY%, BYVAL StartAng!,
  11119.           BYVAL EndAng!)
  11120.           DECLARE SUB DRWSTRING (BYVAL Mode%, BYVAL FColr%, BYVAL BColr%,
  11121.           Strng$, BYVAL X%, BYVAL Y%)
  11122.           DECLARE SUB DRWSTRINGDN (BYVAL Mode%, BYVAL FColr%, BYVAL BColr%,
  11123.           Strng$, BYVAL X%, BYVAL Y%)
  11124.           DECLARE SUB DRWSTRINGLT (BYVAL Mode%, BYVAL FColr%, BYVAL BColr%,
  11125.           Strng$, BYVAL X%, BYVAL Y%)
  11126.           DECLARE SUB DRWSTRINGRT (BYVAL Mode%, BYVAL FColr%, BYVAL BColr%,
  11127.           Strng$, BYVAL X%, BYVAL Y%)
  11128.           DECLARE SUB FILLAREA (BYVAL Xseed%, BYVAL Yseed%, BYVAL
  11129.           BorderColr%, BYVAL FillColr%)
  11130.  
  11131.  
  11132.  
  11133.                                                                         178
  11134.  
  11135.  
  11136.  
  11137.  
  11138.  
  11139.           DECLARE SUB FILLCOLOR (BYVAL Xseed%, BYVAL Yseed%, BYVAL
  11140.           OldColr%, BYVAL NewColr%)
  11141.           DECLARE SUB FILLCONVEXPOLY (BYVAL Colr%, BYVAL Points%, SEG
  11142.           InAry%)
  11143.           DECLARE SUB FILLPOLY (BYVAL Colr%, BYVAL Points%, SEG InAry%)
  11144.           DECLARE SUB FILLSCREEN (BYVAL Colr%)
  11145.           DECLARE SUB FILLPAGE (BYVAL Colr%)
  11146.           DECLARE SUB FILLVIEW (BYVAL Colr%)
  11147.           DECLARE SUB FONTGETINFO (SEG WDTH%, SEG HGHT%)
  11148.           DECLARE SUB FONTSET (FONT$)
  11149.           DECLARE SUB FONTSYSTEM ()
  11150.           DECLARE FUNCTION GETARCCOS% (BYVAL Value&)
  11151.           DECLARE FUNCTION GETARCSIN% (BYVAL Value&)
  11152.           DECLARE FUNCTION GETARCTAN% (BYVAL Value&)
  11153.           DECLARE FUNCTION GETCOS& (BYVAL Ang&)
  11154.           DECLARE FUNCTION GETSIN& (BYVAL Ang&)
  11155.           DECLARE FUNCTION GETTAN& (BYVAL Ang&)
  11156.           DECLARE FUNCTION GETSQRT& (BYVAL Number&)
  11157.           DECLARE FUNCTION GETMAXX% ()
  11158.           DECLARE FUNCTION GETMAXY% ()
  11159.           DECLARE SUB GETLASTSTRING (SEG StrngGfxBlk%)
  11160.           DECLARE FUNCTION GETPOINT% (BYVAL X%, BYVAL Y%)
  11161.           DECLARE SUB JOYSTICKINFO (SEG JAX%, SEG JAY%, SEG JAButs%, SEG
  11162.           JBX%, SEG JBY%, SEG JBButs%)
  11163.           DECLARE SUB MOUSEBUTPRESS (BYVAL ReqBut%, SEG Xloc%, SEG Yloc%,
  11164.           SEG Num%, SEG MButs%)
  11165.           DECLARE SUB MOUSEBUTRELEASE (BYVAL ReqBut%, SEG Xloc%, SEG Yloc%,
  11166.           SEG Num%, SEG MButs%)
  11167.           DECLARE SUB MOUSECURSORDEFAULT ()
  11168.           DECLARE SUB MOUSECURSORSET (MouseCursor$)
  11169.           DECLARE SUB MOUSEENTER ()
  11170.           DECLARE SUB MOUSEEXIT ()
  11171.           DECLARE SUB MOUSEHIDE ()
  11172.           DECLARE SUB MOUSEINFO (SEG DrvMajorVer%, SEG DrvMinorVer%, SEG
  11173.           MouseType%, SEG IRQnumber%)
  11174.           DECLARE SUB MOUSELOCSET (BYVAL Xloc%, BYVAL Yloc%)
  11175.           DECLARE SUB MOUSERANGESET (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL
  11176.           Y2%)
  11177.           DECLARE SUB MOUSERESTORESTATE (SEG MouseBuf%)
  11178.           DECLARE SUB MOUSESAVESTATE (SEG MouseBuf%)
  11179.           DECLARE SUB MOUSESENSSET (BYVAL Xsens%, BYVAL Ysens%)
  11180.           DECLARE SUB MOUSESHOW ()
  11181.           DECLARE SUB MOUSESTATUS (SEG X%, SEG Y%, SEG MButs%)
  11182.           DECLARE FUNCTION MOUSESTORAGESIZE% ()
  11183.           DECLARE SUB OVERSCANSET (BYVAL Colr%)
  11184.           DECLARE FUNCTION PAGEDISPLAY% (BYVAL X%, BYVAL Y%, BYVAL Page%)
  11185.           DECLARE FUNCTION PAGEACTIVE% (BYVAL Page%)
  11186.           DECLARE SUB PALCHGAUTO (PalString$, NewPalString$, BYVAL
  11187.           FirstColr%, BYVAL LastColr%, BYVAL Speed%)
  11188.           DECLARE SUB PALCHGSTEP (PalString$, NewPalString$, BYVAL
  11189.           FirstColr%, BYVAL LastColr%, BYVAL Percent%)
  11190.           DECLARE SUB PALCOPY (SourcePalString$, DestPalString$, BYVAL
  11191.           FirstColr%, BYVAL LastColr%)
  11192.  
  11193.  
  11194.  
  11195.                                                                         179
  11196.  
  11197.  
  11198.  
  11199.  
  11200.  
  11201.           DECLARE SUB PALDIMSTEP (PalString$, BYVAL FirstColr%, BYVAL
  11202.           LastColr%, BYVAL Percent%)
  11203.           DECLARE SUB PALGET (PalString$, BYVAL FirstColr%, BYVAL
  11204.           LastColr%)
  11205.           DECLARE SUB PALIOAUTO (PalString$, BYVAL FirstColr%, BYVAL
  11206.           LastColr%, BYVAL Speed%)
  11207.           DECLARE SUB PALROTATE (PalString$, BYVAL FirstColr%, BYVAL
  11208.           LastColr%, BYVAL Shift%)
  11209.           DECLARE SUB PALSET (PalString$, BYVAL FirstColr%, BYVAL
  11210.           LastColr%)
  11211.           DECLARE FUNCTION PCXMAKE% (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL
  11212.           Y2%, FileName$)
  11213.           DECLARE FUNCTION PCXGETINFO% (FileName$, SEG PCXXSize%, SEG
  11214.           PCXYSize%, SEG NumColors%, Pal$)
  11215.           DECLARE FUNCTION PCXPUT% (BYVAL Mode%, BYVAL Xloc%, BYVAL Yloc%,
  11216.           Name$)
  11217.           DECLARE FUNCTION RES320% ()
  11218.           DECLARE FUNCTION RES640L% ()
  11219.           DECLARE FUNCTION RES640% ()
  11220.           DECLARE FUNCTION RES800% ()
  11221.           DECLARE FUNCTION RES1024% ()
  11222.           DECLARE FUNCTION RES1280% ()
  11223.           DECLARE FUNCTION RESTEXT% ()
  11224.           DECLARE SUB SCROLLDN (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%,
  11225.           BYVAL Num%, BYVAL Colr%)
  11226.           DECLARE SUB SCROLLLT (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%,
  11227.           BYVAL Num%, BYVAL Colr%)
  11228.           DECLARE SUB SCROLLRT (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%,
  11229.           BYVAL Num%, BYVAL Colr%)
  11230.           DECLARE SUB SCROLLUP (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%,
  11231.           BYVAL Num%, BYVAL Colr%)
  11232.           DECLARE SUB SDELAY (BYVAL Count%)
  11233.           DECLARE SUB SETCARD (BYVAL CHIP%, BYVAL MEM%)
  11234.           DECLARE SUB SETVIEW (BYVAL X1%, BYVAL Y1%, BYVAL X2%, BYVAL Y2%)
  11235.           DECLARE SUB SPRITEGAP (BYVAL TransColr%, BYVAL X%, BYVAL Y%, SEG
  11236.           SpriteGfxBlk%, SEG BkgndGfxBlk%)
  11237.           DECLARE SUB SPRITEGET (BYVAL TransColr%, BYVAL X%, BYVAL Y%, SEG
  11238.           SpriteGfxBlk%, SEG BkgndGfxBlk%)
  11239.           DECLARE SUB SPRITEPUT (BYVAL Mode%, BYVAL TransColr%, BYVAL X%,
  11240.           BYVAL Y%, SEG SpriteGfxBlk%)
  11241.           DECLARE FUNCTION SPRITECOLLDETECT% (BYVAL TransColr%, BYVAL
  11242.           Sprite1LocX%, BYVAL Sprite1LocY%, BYVAL Sprite2LocX%, BYVAL
  11243.           Sprite2LocY%, SEG Sprite1GfxBlk%, SEG Sprite2GfxBlk%)
  11244.           DECLARE FUNCTION VIDEOMODEGET% ()
  11245.           DECLARE SUB VIDEOMODESET (BYVAL Mode%)
  11246.           DECLARE SUB VIDEOOFF ()
  11247.           DECLARE SUB VIDEOON ()
  11248.           DECLARE FUNCTION WHICHCPU% ()
  11249.           DECLARE FUNCTION WHICHJOYSTICK% ()
  11250.           DECLARE FUNCTION WHICHMEM% ()
  11251.           DECLARE FUNCTION WHICHMOUSE% ()
  11252.           DECLARE FUNCTION WHICHVGA% ()
  11253.           DECLARE FUNCTION WHICHXMS% (SEG XmsKbytesAvailable%, SEG
  11254.           XmsHandlesAvailable%)
  11255.  
  11256.  
  11257.                                                                         180
  11258.  
  11259.  
  11260.  
  11261.  
  11262.  
  11263.           DECLARE FUNCTION XMSALLOCATE% (BYVAL ReqKbytesOfMem%)
  11264.           DECLARE FUNCTION XMSBLKGET% (BYVAL X1%, BYVAL Y1%, BYVAL X2%,
  11265.           BYVAL Y2%)
  11266.           DECLARE FUNCTION XMSBLKPUT% (BYVAL Mode%, BYVAL X%, BYVAL Y%,
  11267.           BYVAL XmsHandle%)
  11268.           DECLARE FUNCTION XMSCOPY% (BYVAL XmsHandle1%, BYVAL
  11269.           OffsetIntoXms1&, BYVAL XmsHandle2%, BYVAL OffsetIntoXms2&, BYVAL
  11270.           NumOfBytes&)
  11271.           DECLARE FUNCTION XMSERROR% ()
  11272.           DECLARE FUNCTION XMSFREE% (BYVAL XmsHandle%)
  11273.           DECLARE FUNCTION XMSGET% (BYVAL XmsHandle%, BYVAL OffsetIntoXms&,
  11274.           SEG DestVar%, BYVAL NumOfBytes&)
  11275.           DECLARE FUNCTION XMSPUT% (SEG SourceVar%, BYVAL XmsHandle%, BYVAL
  11276.           OffsetIntoXms&, BYVAL NumOfBytes&)
  11277.           DECLARE FUNCTION XMSSCREENGET% ()
  11278.           DECLARE FUNCTION XMSSCREENPUT% (BYVAL XmsHandle%)
  11279.  
  11280.  
  11281.  
  11282.  
  11283.  
  11284.  
  11285.  
  11286.  
  11287.  
  11288.  
  11289.  
  11290.  
  11291.  
  11292.  
  11293.  
  11294.  
  11295.  
  11296.  
  11297.  
  11298.  
  11299.  
  11300.  
  11301.  
  11302.  
  11303.  
  11304.  
  11305.  
  11306.  
  11307.  
  11308.  
  11309.  
  11310.  
  11311.  
  11312.  
  11313.  
  11314.  
  11315.  
  11316.  
  11317.  
  11318.  
  11319.                                                                         181
  11320.  
  11321.  
  11322.  
  11323.  
  11324.  
  11325.           APPENDIX B.  JOYSTICK PORTS AND Y-CABLES
  11326.  
  11327.           SCHEMATIC WIRING DIAGRAM FOR A STANDARD JOYSTICK PORT
  11328.  
  11329.                                     DB15 male
  11330.                                     connector
  11331.                    Joystick B            ___       Joystick A
  11332.                                       __/   |
  11333.                                      /    o | 1 -------------------+
  11334.              +------------------  9 | o     |     ___Button A      |
  11335.              |     Button A___      |     o | 2 --o o-+            |
  11336.              |           +-o o-- 10 | o     |         |    X Axis  |
  11337.              |  X Axis   |          |     o | 3 -------------+     |
  11338.              |     +------------ 11 | o     |         |      |     |
  11339.              |     |     |          |     o | 4 ------+      |     |
  11340.              +--/\/\/\   +------ 12 | o     |         |    /\/\/\--+
  11341.              |           |          |     o | 5       |            |
  11342.              |     +------------ 13 | o     |         |            |
  11343.              |     |     | ___      |     o | 6 -------------+     |
  11344.              |     |     +-o o-- 14 | o     |     ___ |      |     |
  11345.              |     |    Button B    |     o | 7 --o o-+      |     |
  11346.              |     |             15 | o     |   Button B   /\/\/\--+
  11347.              +--/\/\/\               \__  o | 8            Y Axis
  11348.                Y Axis                   \___|
  11349.  
  11350.  
  11351.           Notes:
  11352.  
  11353.           1)This diagram comes with NO warranties expressed or implied.
  11354.             It is provided for information only.  In no event shall
  11355.             Stephen L. Balkum, Daniel A. Sill or Zephyr Software be held
  11356.             liable for damages resulting from use, misuse, or inability to
  11357.             use this information.
  11358.  
  11359.           2)The x and y axis potentiometers have a typical range of 0 to
  11360.             100k ohms.  Buttons are normally open and close when pressed.
  11361.  
  11362.           3)This diagram is correct for joystick ports that conform to the
  11363.             standard set forth by IBM. Some specialty joystick cards
  11364.             provide separate A and B joystick connectors.  For these
  11365.             cards, both connectors are wired to pins 1 through 8 as shown
  11366.             in the diagram.
  11367.  
  11368.           4)Many 'Super I/O' boards (2H/2F/2S/1P/1G) equipped with a
  11369.             joystick port will support only one joystick.  On these cards,
  11370.             pins 9 through 15 are not used.
  11371.  
  11372.           5)Commercially available joysticks are wired to use pins 1
  11373.             through 8 and, therefore, will always be 'Joystick A' if
  11374.             plugged directly into a dual joystick port connector.
  11375.  
  11376.           6)Many sound cards provide joystick ports; however, their
  11377.             connector wiring does not always conform to the standard shown
  11378.             above.  Some of these connectors may be used for other
  11379.  
  11380.  
  11381.                                                                         182
  11382.  
  11383.  
  11384.  
  11385.  
  11386.  
  11387.             purposes such as a MIDI port.  See the documentation that
  11388.             comes with the sound card.
  11389.  
  11390.           7)If there is more than one joystick port on a computer
  11391.             configured to operate the same joystick, only ONE port should
  11392.             be enabled at any given time for proper operation.  Disable
  11393.             all but one joystick port.  For example, if the computer has
  11394.             both a Super I/O card and a sound card, the joystick port on
  11395.             the Super I/O card should be disabled since the sound card's
  11396.             port probably supports two joysticks and the I/O card supports
  11397.             only one.
  11398.  
  11399.  
  11400.  
  11401.  
  11402.  
  11403.  
  11404.  
  11405.  
  11406.  
  11407.  
  11408.  
  11409.  
  11410.  
  11411.  
  11412.  
  11413.  
  11414.  
  11415.  
  11416.  
  11417.  
  11418.  
  11419.  
  11420.  
  11421.  
  11422.  
  11423.  
  11424.  
  11425.  
  11426.  
  11427.  
  11428.  
  11429.  
  11430.  
  11431.  
  11432.  
  11433.  
  11434.  
  11435.  
  11436.  
  11437.  
  11438.  
  11439.  
  11440.  
  11441.  
  11442.  
  11443.                                                                         183
  11444.  
  11445.  
  11446.  
  11447.  
  11448.  
  11449.           SCHEMATIC WIRING DIAGRAM FOR A JOYSTICK Y-CABLE
  11450.  
  11451.                                               ___
  11452.                          DB15 male         __/   |
  11453.                        connector to       /    o | 1 --------+
  11454.                        Joystick Port   9 | o     |           |
  11455.                         on computer      |     o | 2 --------|-+
  11456.                             +-------- 10 | o     |           | |
  11457.                             |            |     o | 3 --------|-|-+
  11458.                             | +------ 11 | o     |           | | |
  11459.                             | |          |     o | 4 --------|-|-|-+
  11460.                             | |       12 | o     |           | | | |
  11461.                             | |          |     o | 5         | | | |
  11462.                             | | +---- 13 | o     |           | | | |
  11463.                             | | |        |     o | 6 --------|-|-|-|-+
  11464.                             | | | +-- 14 | o     |           | | | | |
  11465.                             | | | |      |     o | 7 --------|-|-|-|-|-+
  11466.                             | | | |   15 | o     |           | | | | | |
  11467.                             | | | |       \__  o | 8         | | | | | |
  11468.                             | | | |          \___|           | | | | | |
  11469.                             | | | |                          | | | | | |
  11470.                             | | | |                          | | | | | |
  11471.                             | | | |  +-----------------------+ | | | | |
  11472.                             | | | |  |                       | | | | | |
  11473.                             | | | |  | +---------------------|-|-|-+ | |
  11474.                             | | | |  | |                     | | | | | |
  11475.                             | | | |  | |                     | | | | | |
  11476.            DB15 female      | | | |  | |     DB15 female     | | | | | |
  11477.            connector to     | | | |  | |     connector to    | | | | | |
  11478.             Joystick B      | | | |  | |      Joystick A     | | | | | |
  11479.                   ___       | | | |  | |            ___      | | | | | |
  11480.                __/   |      | | | |  | |         __/   |     | | | | | |
  11481.               /    o | 1 ---|-|-|-|--+ |        /    o | 1 --+ | | | | |
  11482.            9 | o     |      | | | |    |     9 | o     |       | | | | |
  11483.              |     o | 2 ---+ | | |    |       |     o | 2 ----+ | | | |
  11484.           10 | o     |        | | |    |    10 | o     |         | | | |
  11485.              |     o | 3 -----+ | |    |       |     o | 3 ------+ | | |
  11486.           11 | o     |          | |    |    11 | o     |           | | |
  11487.              |     o | 4 -------|-|----+       |     o | 4 --------+ | |
  11488.           12 | o     |          | |         12 | o     |             | |
  11489.              |     o | 5        | |            |     o | 5           | |
  11490.           13 | o     |          | |         13 | o     |             | |
  11491.              |     o | 6 -------+ |            |     o | 6 ----------+ |
  11492.           14 | o     |            |         14 | o     |               |
  11493.              |     o | 7 ---------+            |     o | 7 ------------+
  11494.           15 | o     |                      15 | o     |
  11495.               \__  o | 8                        \__  o | 8
  11496.                  \___|                             \___|
  11497.  
  11498.  
  11499.           Notes:
  11500.  
  11501.           1)This diagram comes with NO warranties expressed or implied.
  11502.             It is provided for information only.  In no event shall
  11503.  
  11504.  
  11505.                                                                         184
  11506.  
  11507.  
  11508.  
  11509.  
  11510.  
  11511.             Stephen L. Balkum, Daniel A. Sill or Zephyr Software be held
  11512.             liable for damages resulting from use, misuse, or inability to
  11513.             use this information.
  11514.  
  11515.           2)This cable has worked with a standard joystick port connector,
  11516.             a Sound Blaster port connector, and a Sound Blaster Pro
  11517.             joystick port connector.
  11518.  
  11519.  
  11520.  
  11521.  
  11522.  
  11523.  
  11524.  
  11525.  
  11526.  
  11527.  
  11528.  
  11529.  
  11530.  
  11531.  
  11532.  
  11533.  
  11534.  
  11535.  
  11536.  
  11537.  
  11538.  
  11539.  
  11540.  
  11541.  
  11542.  
  11543.  
  11544.  
  11545.  
  11546.  
  11547.  
  11548.  
  11549.  
  11550.  
  11551.  
  11552.  
  11553.  
  11554.  
  11555.  
  11556.  
  11557.  
  11558.  
  11559.  
  11560.  
  11561.  
  11562.  
  11563.  
  11564.  
  11565.  
  11566.  
  11567.                                                                         185